Movefile "the system cannot find the path specified" (Windows OS)
22 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
I'm writing a small file renaming function to reverse the order of a list of image files (code below). I've run into an error using movefile. I get the error "Error using movefile ... The system cannot find the path specified." on the first call of movefile.
Surprisingly, I found that if I change
[dirname '\' 'TEMP_' fnames{n1}]
to
['TEMP_' fnames{n1}]
in both movefile calls, it now works and no longer throws the error. However, this means the files are moved to the local directory and then back again, which is obviously pretty slow when working with files on a network!
I've got a feeling this is related to the path length limitations of Windows OS. I've spent some time trying to research workarounds for the path length limit, but haven't yet found anything comprehensive. If anyone has a link to good material on the subject please let me know.
function reverseImgStackDir()
% Select folder
dirname = uigetdir('C:\');
% Compile list of tif image files
fnames = dir([dirname '\*.tif']);
fnames = {fnames.name}';
% 1st pass - swap file names
for n1 = 1:length(fnames)
% Index working from the end backwards
n2 = length(fnames)+1 - n1;
% Temporarily rename file
movefile([dirname '\' fnames{n2}], [dirname '\' 'TEMP_' fnames{n1}])
end
% 2nd pass - remove temp qualifier
for n1 = 1:length(fnames)
% Temporarily rename file
movefile([dirname '\' 'TEMP_' fnames{n1}], [dirname '\' fnames{n1}])
end
2 Commenti
Guillaume
il 24 Mag 2018
Would adding just 5 characters take you over the MAX_PATH limit (260 characters)? I would suspect that's not the issue. What's a typical dirname value / length?
Risposta accettata
Guillaume
il 24 Mag 2018
In addition to Jan's suggestion of the FileExchange files, since you're on Windows you can also delegate the renaming to .Net:
prefix = ['\\?\', dirname, '\']; %\\?\ to enable paths longer than MAX_PATH
System.IO.File.Move([prefix, fnames{n2}], [prefix, 'TEMP_', fnames{n1}]);
Più risposte (2)
Jan
il 24 Mag 2018
Modificato: Jan
il 24 Mag 2018
If the length of the names matter, use https://www.mathworks.com/matlabcentral/fileexchange/28249-getfullpath, which inserts \\?\ in front of long names automatically.
In addition https://www.mathworks.com/matlabcentral/fileexchange/29569-filerename is much faster than movefile.
3 Commenti
Ameer Hamza
il 24 Mag 2018
Instead of constructing the complete path yourself, try to using fullfile(). It will properly construct the path by taking care of which slash to use ( \ for windows and / for mac)
path = fullfile(dirname, ['TEMP_' fnames{n1}]);
Vedere anche
Categorie
Scopri di più su Logical in Help Center e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!