San*_*har 4 matlab file file-exists
我在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
Run Code Online (Sandbox Code Playgroud)
确认它不是奇怪/有问题的文件名,我从Cygwin shell检查:
/cygdrive/i/ $ if [ -f file2.asc ]; then echo "OK"; fi
OK
Run Code Online (Sandbox Code Playgroud)
所以文件很好.我尝试重命名它
/cygdrive/i/ $ mv file2.asc test
Run Code Online (Sandbox Code Playgroud)
在Matlab中
>> ls
file1.asc file3.asc test
>> exist('test')
ans =
0
Run Code Online (Sandbox Code Playgroud)
如果我退出并重新启动Matlab它工作正常.但我需要动态创建文件然后访问它!
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()
Run Code Online (Sandbox Code Playgroud)
或者由于ls()命令显示了您想要的文件,您可以在ls之上实现文件存在检查.
ismember({'file2.asc'}, ls())
Run Code Online (Sandbox Code Playgroud)
"{}"是使ismember()在字符串级别而不是char级别操作所必需的.
如果您仍然无法阅读它,请尝试在Matlab中使用Java进行较低级别的读取.这将告诉你它是否特别是Matlab的I/O函数有问题,或者进程本身是否缺少对文件的访问权限.试试这个.如果你从中得到一个char,这意味着你的Matlab.exe进程可以看到该文件.
istr = java.io.FileInputStream('file2.asc')
c = char(istr.read())
Run Code Online (Sandbox Code Playgroud)