由于无法提供完全可重复的示例而提前道歉,并非所有人都会有网络驱动器进行试验。
我有一个处理功能,我用它来执行数据缩减,我们的数据存储在网络驱动器上。今天早上调试的时候我发现了一些奇怪的东西(对我来说),我很想知道为什么Windows(Win7,64位)就是这样的。我的Google-fu已被击败。
举个例子,假设我在\\mynetworkshare
\\mynetworkshare\testdata\a
\\mynetworkshare\testdata\b
\\mynetworkshare\testdata\c
\\mynetworkshare\testdata\c\day1
\\mynetworkshare\testdata\c\day2
每个somedatafile_n.abc
文件夹中都有day
。
我的函数在这种情况下解析用户指定的文件夹c
,并查找与过滤器匹配的所有数据文件:
searchpath = '\\mynetworkshare\testdata\c'
oldpath = cd(searchpath); % cd to data directory for simpler dir call
[~, filenames] = system('dir /S /B somedatafile_*.abc');
filelist = regexp(filenames, '(.:\\[\w\-\\. ]+\.\w+)', 'match'); % Split filenames
cd(oldpath);
这将返回文件名的单元格数组:
Z:\day1\somedatafile_1.abc
Z:\day1\somedatafile_2.abc
Z:\day2\somedatafile_1.abc
但是,这些不是用于低级I / O的有效路径:
Error using textscan
Invalid file identifier. Use fopen to generate a valid file identifier.
应该注意的是,如果我安装网络驱动器并使用该路径,则此功能正常:
searchpath = 'H:\testdata\c'
oldpath = cd(searchpath); % cd to data directory for simpler dir call
[~, filenames] = system('dir /S /B somedatafile_*.abc');
filelist = regexp(filenames, '(.:\\[\w\-\\. ]+\.\w+)', 'match'); % Split filenames
cd(oldpath);
返回:
H:\testdata\c\day1\somedatafile_1.abc
H:\testdata\c\day1\somedatafile_2.abc
H:\testdata\c\day2\somedatafile_1.abc
答案 0 :(得分:4)
来自https://www.mathworks.com/help/matlab/ref/system.html
DOS不支持UNC路径名。因此,如果当前文件夹使用UNC路径名,则使用依赖于当前文件夹的DOS命令运行系统将失败。要解决此限制,请在调用system之前将文件夹更改为映射驱动器。
system('net use Z: \\mynetworkshare\testdata\c')
cd('Z:\')
fileID = fopen('day1\somedatafile_1.abc');
C = textscan(fileID,'%s %s %f32 %d8 %u %f %f %s %f');
fclose(fileID);
答案 1 :(得分:1)
如果您只使用cd
和dir
来获取以后可以在Matlab中打开的文件名列表,那么 dos
命令。
Matlab函数ls
可以为您做到这一点。 您甚至不必更改工作目录 ;-)
我已根据您的示例在共享驱动器上创建了目录结构和文件:
然后,无需借助外部命令,您可以通过以下方式获取您感兴趣的文件列表:
baseShareName = '\\CASTOR\SharedFolder\testdata' ;
%// let's get the folder list in a variable (but you can easily hard code it if you prefer
folderList = cellstr( ls(baseShareName) ) ; %// cellstr wrapping call otherwise the output is a char array
%// return the file names of interest in the folder #5 (which is "c")
fileList = ls( [baseShareName '\' folderList{5} '\somedatafile*.abc'] ) %'// ignore this comment
%// and/or if you prefer to get the full length name (valid for later "fopen")
fullNameList = fullfile( baseShareName , folderList{5} , cellstr(fileList) )
会给你:
fileList =
somedatafile_01.abc
somedatafile_03.abc
fullNameList =
'\\CASTOR\SharedFolder\testdata\c\somedatafile_01.abc'
'\\CASTOR\SharedFolder\testdata\c\somedatafile_03.abc'
这些文件名完全可以用于 Matlab 低级I / O功能:
>> fid = fopen( fullNameList{1} , 'r' )
fid =
3
3
是一个有效的文件标识符,可用于任何Matlab文件操作函数。