4

我在 Windows 下运行 Matlab 7.8.0。

我正在调用一个外部实用程序,使用dos()它在当前目录中创建一个文件。existI 文件已正确创建,但or无法看到它fopen,它分别返回0and -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

4 回答 4

7

很神秘。

你可以试试:

  • rehash命令看看是否有帮助。
  • 存在的两个参数版本:exist('foo.txt', 'file')
于 2010-10-15T01:00:08.113 回答
6

Matlab 的exist() 命令不是一个简单的文件系统操作;它还查看变量、函数等。由于您在 I: 上,我假设这是一个网络驱动器,并且您可能遇到了 Jonas 提到的 dir 内容缓存问题。

如果 nsanders 的两个参数存在()或 Jonas 的更改通知修复对您不起作用,这里还有一些其他解决方法。

尝试使用文件的绝对路径,例如“fopen('I:\file2.asc')”,而不是相对路径和密码。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())
于 2010-10-15T14:39:25.783 回答
2

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

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

于 2010-10-15T01:34:51.020 回答
1

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

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

于 2010-10-15T01:00:57.707 回答