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() 调用一个外部实用程序,它会在当前目录中创建一个文件。 我文件创建正确,但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,它可以正常工作。但是我需要动态创建文件然后访问它!

【问题讨论】:

我不知道 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!的主要内容,如果未能解决你的问题,请参考以下文章

File

如何在Python内部判断某个文件是否存在

php文件下载,不能找到用file_exists()判断文件存放的绝对路径是,提示文件不存在。。

File.Exists仅在文件名上返回true

C# File.Exists 返回 false,文件确实存在

File.exists() 为现有文件返回 false