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

时间:2010-10-15 00:47:49

标签: file matlab 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

确认它不是奇怪/有问题的文件名,我从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,它可以正常工作。但是我需要动态创建文件然后访问它!

4 个答案:

答案 0 :(得分:7)

非常神秘。

你可以尝试:

  • rehash 命令,看看是否有帮助。
  • 存在的双参数版本:存在('foo.txt','file')

答案 1 :(得分: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()

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

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

“{}”必须使ismember()在字符串级别而不是char级别上运行。

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

istr = java.io.FileInputStream('file2.asc')
c = char(istr.read())

答案 2 :(得分:2)

在Windows上,我曾经在启动时获取更改句柄通知警告,直到我关闭警告。我现在手头没有7.8,但默认情况下可能会关闭警告。

正如MathWorks site所述,如果Windows用完更改通知句柄,它将无法正确“感知”目录内容是否已更改,这可能会导致您的问题。

答案 3 :(得分:1)

您确定MATLAB与资源管理器的用户相同吗?如果MATLAB需要提升权限才能运行,那么驱动器映射可能会有所不同,您可能会发现I:\驱动器未映射。

要解决此问题,您需要以提升的权限以某种方式映射I:驱动器。