Не могу сказать, существует ли файл на общем ресурсе samba - PullRequest
0 голосов
/ 27 октября 2010

Я знаю, что имя файла file001.txt или FILE001.TXT, но я не знаю, какое. Файл находится на компьютере с Windows, к которому я получаю доступ через точку монтирования samba.

Кажется, что функции в 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 ]

1 голос
/ 27 октября 2010

Вы можете попробовать добавить nocase к монтированию в вашем fstab, как в примере, который я выкопал ниже, если его там еще нет:

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

Найдена ссылка, объясняющая нормальный регистр

normcase - полезная небольшая функция, которая компенсирует регистронезависимые операционные системы, которые считают, что mahadeva.mp3 и mahadeva.MP3 - это один и тот же файл.Например, в Windows и Mac OS normcase преобразует все имя файла в нижний регистр;в UNIX-совместимых системах он вернет имя файла без изменений.

Это говорит о том, что open, вероятно, всегда , ожидая имя файла в нижнем регистре в файловых системах Windows.

Таким образом, причина того, что os.path не чувствителен к регистру, состоит в том, что он, вероятно, вызывает os.path.normcase перед проверкой файла, а open - нет.Хотя это также может быть просто ошибкой.

0 голосов
/ 27 октября 2010
def exists(path):
    try:
        open(path).close()
    except IOError:
        return False
    return True

Проблемы с разрешениями, почему вы не хотите открывать файл?

0 голосов
/ 27 октября 2010

Чтобы ответить на ваши вопросы:

  1. Вы можете использовать stat, чтобы определить, существует файл или нет, не пытаясь открыть его.
  2. Файловые системы Windows Shares не чувствительны к регистру.
...