我正在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,它可以正常工作。但是我需要动态创建文件然后访问它!
答案 0 :(得分:7)
非常神秘。
你可以尝试:
答案 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:驱动器。