Matlab 'exist' 为绝对存在的文件返回 0!
Posted
技术标签:
【中文标题】Matlab \'exist\' 为绝对存在的文件返回 0!【英文标题】:Matlab 'exist' returns 0 for a file that definitely exists!Matlab 'exist' 为绝对存在的文件返回 0! 【发布时间】:2011-04-25 17:15:12 【问题描述】:我在 Windows 下运行 Matlab 7.8.0。
我正在使用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 shell 中进行了检查:
/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,它可以正常工作。但是我需要动态创建文件然后访问它!
【问题讨论】:
我不知道 Matlab,但听起来您可能遇到了缓存文件系统信息的问题。 我没有安装 7.8,但我在 R2007b (7.5) 和 R2009b (7.9) 中尝试了这个,并且两者都适用。我首先打开了 MATLAB,然后在 MATLAB 当前目录的 DOS 窗口中使用edit
命令创建了一个文件。 exist
在文件创建后立即返回 2。
我遇到了与您类似的问题,但在我的情况下,我试图使用通配符来检查存在的任何类似文件:exist('~/hi*.txt','file')
,但失败了。有点类似于安德鲁的回答和这个one,我做了~isempty(dir('~/hi*.txt'))
【参考方案1】:
非常神秘。
你可以试试:
rehash 命令看看是否有帮助。 exist 的两个参数版本:exist('foo.txt', 'file')【讨论】:
【参考方案2】:Matlab 的exist() 命令不是一个简单的文件系统操作;它还查看变量、函数等。由于您在 I: 上,我假设这是一个网络驱动器,您可能遇到了 Jonas 提到的 dir 内容缓存问题。
如果 nsanders 的两个参数存在()或 Jonas 的更改通知修复对您不起作用,这里有几个其他解决方法。
尝试使用文件的绝对路径,例如“fopen('I:\file2.asc')”,而不是相对路径和 pwd。 Matlab 将不合格的文件名视为exist() 和fopen() 的“部分路径”,并与目录信息缓存交互。 ls() 不适用于部分路径,这可能是它可以看到文件而其他函数不能的原因。
您可以在 Matlab 中使用 Java 进行更简单的文件存在性测试。
java.io.File('file2.asc').exists()
或者由于 ls() 命令显示你想要的文件,你可以在 ls 之上实现文件存在检查。
ismember('file2.asc', ls())
“ ”是使 ismember() 在字符串级别而不是字符级别运行所必需的。
如果您仍然无法阅读它,请尝试在 Matlab 中使用 Java 进行较低级别的阅读。这将告诉您是否特别是 Matlab 的 I/O 函数有问题,或者进程本身缺乏对文件的访问权限。尝试这个。如果您从中得到一个字符,则意味着您的 Matlab.exe 进程可以看到该文件。
istr = java.io.FileInputStream('file2.asc')
c = char(istr.read())
【讨论】:
【参考方案3】:在 Windows 上,我过去常常在启动时收到更改句柄通知警告,直到我关闭警告为止。我现在手头没有 7.8,但警告可能默认关闭。
正如MathWorks site 中所述,如果 Windows 用完更改通知句柄,它将无法正确“感知”目录的内容是否已更改,这可能会导致您的问题。
【讨论】:
谢谢 - 我没有收到任何警告,但我认为这是问题的根源。致电rehash
解决了它。【参考方案4】:
您确定 MATLAB 以与资源管理器相同的用户身份运行吗?如果 MATLAB 需要提升权限才能运行,则驱动器映射可能不同,您会发现 I:\ 驱动器未映射。
要解决此问题,您需要以某种方式在提升权限下映射 I: 驱动器。
【讨论】:
以上是关于Matlab 'exist' 为绝对存在的文件返回 0!的主要内容,如果未能解决你的问题,请参考以下文章
php文件下载,不能找到用file_exists()判断文件存放的绝对路径是,提示文件不存在。。