系统dir调用网络驱动器修剪文件路径

时间:2015-06-30 15:10:06

标签: matlab

由于无法提供完全可重复的示例而提前道歉,并非所有人都会有网络驱动器进行试验。

我有一个处理功能,我用它来执行数据缩减,我们的数据存储在网络驱动器上。今天早上调试的时候我发现了一些奇怪的东西(对我来说),我很想知道为什么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

2 个答案:

答案 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)

如果您只使用cddir来获取以后可以在Matlab中打开的文件名列表,那么 dos命令。

Matlab函数ls可以为您做到这一点。 您甚至不必更改工作目录 ;-)

我已根据您的示例在共享驱动器上创建了目录结构和文件:

folders

然后,无需借助外部命令,您可以通过以下方式获取您感兴趣的文件列表:

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文件操作函数。