Matlab 'exist' возвращает 0 для файла, который определенно существует! - PullRequest
4 голосов
/ 15 октября 2010

Я использую Matlab 7.8.0 под Windows.

Я вызываю внешнюю утилиту, используя dos(), которая создает файл в текущем каталоге. Если файл создан правильно, но он не виден exist или fopen, которые возвращают 0 и -1 соответственно. Имя файла правильное!

>> pwd
ans = 
I:\

>> ls

file1.asc     file2.asc     file3.asc

>> exist('file1.asc')           % this file was there before
ans =
     2

>> exist('file2.asc')           % this file is newly created
ans =
     0

чтобы подтвердить, что это не странное / проблемное имя файла, я проверил в оболочке Cygwin:

/cygdrive/i/ $ if [ -f file2.asc ]; then echo "OK"; fi
OK

Так что файл хороший. Я попытался переименовать его

/cygdrive/i/ $ mv file2.asc test

и в Matlab

>> ls

file1.asc      file3.asc      test

>> exist('test')
ans =
     0

Если я выйду и перезапущу Matlab, все будет хорошо. Но мне нужно динамически создать файл и затем получить к нему доступ!

Ответы [ 4 ]

7 голосов
/ 15 октября 2010

Очень загадочно.

Вы можете попробовать:

  • Команда rehash , чтобы увидеть, помогает ли это.
  • Существует версия с двумя аргументами: exist ('foo.txt', 'file')
6 голосов
/ 15 октября 2010

Команда Matlab exist () не является простой операцией файловой системы; он также рассматривает переменные, функции и т. д. Поскольку вы используете I:, я предполагаю, что это сетевой диск, и вы, вероятно, столкнулись с проблемой кэширования содержимого dir, о которой упоминает Джонас.

Вот несколько других обходных путей, в случае, если nsanders 'two-arg существуют () или исправления уведомления об изменении Jonas' не работают для вас.

Попробуйте использовать абсолютные пути к файлам, например, "fopen ('I: \ file2.asc')", вместо относительных путей и pwd. Matlab будет обрабатывать неквалифицированные имена файлов как «частичные пути» как для существующих (), так и для fopen (), и это взаимодействует с кэшированием информации каталога. Ls () не работает с частичными путями, поэтому может видеть файл, а другие функции - нет.

Вы можете использовать Java из Matlab, чтобы выполнить более простой тест существования файла.

java.io.File('file2.asc').exists()

Или, так как команда ls () показывает нужный файл, вы можете просто реализовать проверку существования файла поверх ls.

ismember({'file2.asc'}, ls())

"{}" необходимо для того, чтобы функция ismember () работала на уровне строки, а не на уровне символа.

Если у вас все еще проблемы с чтением, попробуйте выполнить чтение более низкого уровня с помощью Java из Matlab. Это скажет вам, есть ли проблемы с определенными функциями ввода / вывода в Matlab, или сам процесс не имеет доступа к файлу. Попробуй это. Если вы получаете символ из этого, это означает, что ваш процесс Matlab.exe может видеть файл.

istr = java.io.FileInputStream('file2.asc')
c = char(istr.read())
2 голосов
/ 15 октября 2010

В Windows я получал предупреждения об изменении дескриптора изменения при запуске, пока не выключил предупреждения. У меня сейчас нет 7.8, но по умолчанию предупреждение может быть отключено.

Как объяснено на сайте MathWorks , если в Windows не хватает дескрипторов уведомлений об изменениях, она не сможет должным образом "определить", изменилось ли содержимое каталога, что может вызывать проблемы .

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

Вы уверены, что MATLAB работает под тем же пользователем, что и проводник?Если для запуска MATLAB требуются повышенные разрешения, сопоставления дисков могут отличаться, и вы можете обнаружить, что диск I: \ не сопоставлен.

Чтобы это исправить, необходимо каким-то образом сопоставить диск I: с повышенными разрешениями..

...