Matlab'exists'为一个绝对存在的文件返回0!

San*_*har 4 matlab file file-exists

我在Windows下运行Matlab 7.8.0.

我正在调用一个外部实用程序,使用dos()它在当前目录中创建一个文件.我该文件是正确创建的,但它不能被看到existfopen,这回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
Run Code Online (Sandbox Code Playgroud)

确认它不是奇怪/有问题的文件名,我从Cygwin shell检查:

/cygdrive/i/ $ if [ -f file2.asc ]; then echo "OK"; fi
OK
Run Code Online (Sandbox Code Playgroud)

所以文件很好.我尝试重命名它

/cygdrive/i/ $ mv file2.asc test
Run Code Online (Sandbox Code Playgroud)

在Matlab中

>> ls

file1.asc      file3.asc      test

>> exist('test')
ans =
     0
Run Code Online (Sandbox Code Playgroud)

如果我退出并重新启动Matlab它工作正常.但我需要动态创建文件然后访问它!

nsa*_*ers 7

很神秘.

你可以尝试:

  • 老调重弹,看看命令是否有帮助.
  • 存在的两个参数版本:exists ('foo.txt','file')


And*_*nke 6

Matlab exists()命令不是简单的文件系统操作; 它还会查看变量,函数等.因为你在I:上,我假设这是一个网络驱动器,你可能正在讨论Jonas提到的dir内容缓存问题.

以下是其他一些解决方法,如果nsanders的两个arg存在()或Jonas的更改通知修复程序不适合您.

尝试使用文件的绝对路径,例如"fopen('I:\ file2.asc')",而不是相对路径和pwd.Matlab会将不合格的文件名视为exists()和fopen()的"部分路径",并与目录信息缓存进行交互.Ls()不适用于部分路径,这可能是它可以看到文件而其他功能不能的原因.

您可以在Matlab中使用Java来进行更简单的文件存在测试.

java.io.File('file2.asc').exists()
Run Code Online (Sandbox Code Playgroud)

或者由于ls()命令显示了您想要的文件,您可以在ls之上实现文件存在检查.

ismember({'file2.asc'}, ls())
Run Code Online (Sandbox Code Playgroud)

"{}"是使ismember()在字符串级别而不是char级别操作所必需的.

如果您仍然无法阅读它,请尝试在Matlab中使用Java进行较低级别的读取.这将告诉你它是否特别是Matlab的I/O函数有问题,或者进程本身是否缺少对文件的访问权限.试试这个.如果你从中得到一个char,这意味着你的Matlab.exe进程可以看到该文件.

istr = java.io.FileInputStream('file2.asc')
c = char(istr.read())
Run Code Online (Sandbox Code Playgroud)