无法判断samba共享上的文件是否存在

0 投票
3 回答
3326 浏览
提问于 2025-04-16 06:08

我知道文件名是 file001.txt 或者 FILE001.TXT,但我不确定具体是哪一个。这个文件在一台我通过samba挂载点访问的Windows机器上。

os.path 里的一些函数好像不区分大小写,但 open 函数却是区分大小写的:

>>> from os.path import exists, isfile

>>> exists('FILE001.TXT')
True

>>> isfile('FILE001.TXT')
True

>>> open('FILE001.TXT')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'FILE001.TXT'

>>> open('file001.txt')    # no problem

所以,我有以下几个问题:

  1. 有没有办法在不打开文件(或者不列出它所在目录)的情况下确定文件名?

  2. 为什么 open 函数要区分大小写,而 os.path 不区分?


更新:感谢大家的回答,但 这不是一个Python的问题,所以我决定关闭这个问题。

3 个回答

0
def exists(path):
    try:
        open(path).close()
    except IOError:
        return False
    return True

除了权限问题,你为什么不想打开这个文件呢?

0

来回答你的问题:

  1. 你可以使用 stat 这个工具来检查一个文件是否存在,而不需要去打开它。
  2. Windows系统的共享文件夹对大小写不敏感,也就是说“文件.txt”和“FILE.txt”被认为是同一个文件。
1

你可以试着在你的 fstab 文件中给挂载添加 nocase,就像我下面找到的这个例子一样,如果它还没有的话:

//server/acme/app    /home/joe/.wine/drive_c/App    cifs    guest,rw,iocharset=utf8,nocase,file_mode=0777,dir_mode=0777    0    0

这里有个链接解释了 normcase

normcase 是一个很实用的小功能,它可以处理那些对文件名大小写不敏感的操作系统,比如说它会把 mahadeva.mp3 和 mahadeva.MP3 认为是同一个文件。例如,在 Windows 和 Mac OS 上,normcase 会把整个文件名转换成小写;而在 UNIX 兼容的系统上,它会保持文件名不变。

这告诉你,在 Windows 文件系统上,open 函数可能总是期待小写的文件名。

所以,os.path 不区分大小写的原因可能是它在检查文件之前调用了 os.path.normcase,而 open 函数没有这样做。不过,这也可能只是个 bug。

撰写回答