2015-01-09 4 views
2

В настоящее время я пишу небольшую программу в Octave (3.8.0, в Windows) для анализа структуры каталогов и получения некоторых данных из файлов в этой структуре. Интересующие файлы не всегда находятся в одном и том же согласованном месте, поэтому я должен их искать, и для этого я широко использую функцию dir.Слишком длинное имя файла Octave

Я столкнулся с проблемой, о которой я не знаю, как ее решить. Для некоторых файлов, я получаю следующее предупреждение при вызове функции реж:

warning: dir: 'lstat (P:\9xxxProjects\blabla\blabla\blabla\blabla\blabla\blabla\blabla\long_filename)' failed: No such file or directory 

и результирующие элементы в структуре выпуска из dir являются:

>> test.name 
ans = . 
ans = .. 
ans = [](0x0) 
ans = [](0x0) 
ans = [](0x0) 
ans = [](0x0) 
ans = [](0x0) 

который делает мою ошибку код из.

Теперь я создал тестовый каталог в базе C:\ drive (C:\Test), скопировал файлы по всему миру и не изменяя ничего (т. Е. Оставив имена файлов без изменений), запустил тот же код. Он прошел отлично, никаких проблем с dir.

Существует ли максимальная длина пути/файла, поддерживаемая dir? Как я могу обойти эту проблему? Я не могу изменить соглашение об именах как структуры каталогов, так и имен файлов. Длина пути к каталогу проблем равна 177, длина имен файлов, которые дают мне проблемы, равна 84, поэтому общая длина 261. Другие файлы в том же каталоге длиной 81 (с общей длиной 258) работать просто отлично. Есть ли в коде максимальная длина 260 символов?

я сузили проблему до вызова lstat и stat в dir:

[st, err, msg] = lstat (fn); 
if (err < 0) 
    warning ("dir: 'lstat (%s)' failed: %s", fn, msg);   
else 
    ## If we are looking at a link that points to something, 
    ## return info about the target of the link, otherwise, return 
    ## info about the link itself. 
    if (S_ISLNK (st.mode)) 
    [xst, err, msg] = stat (fn); 
    if (! err) 
     st = xst; 
    endif 
    endif 

Вот что я получаю, когда я называю lstat и stat с моей проблемой файла/каталога:

>> [st, err, msg] = lstat(fullfile(problem_dir,file_name_test)) 
st = [](0x0) 
err = -1 
msg = No such file or directory 

>> [xst, err, msg] = stat(fullfile(problem_dir,file_name_test)) 
xst = [](0x0) 
err = -1 
msg = Filename too long 

К сожалению, как stat, так и lstat являются встроенными/скомпилированными функциями, поэтому я не могу их редактировать. Может ли кто-нибудь предложить обходное решение?

+0

вы говорите: «... stat и lstat являются встроенными/скомпилированными функциями, поэтому я не могу их редактировать». Однако, если вы наберете 'which lstat', он скажет вам, какой файл нужно редактировать. Вот источник для [stat] (http://hg.savannah.gnu.org/hgweb/octave/file/c304687571c8/libinterp/corefcn/syscalls.cc#l922) и [lstat] (http: //hg.savannah .gnu.org/hgweb/октава/файл/c304687571c8/libinterp/corefcn/syscalls.cC# l782). После этого вам нужно будет перестроить Octave. В любом случае, как уже упоминалось, такие длинные файловые пути не работают должным образом в системах Windows. – carandraug

ответ

3

Максимальная длина пути to be used on Windows is 260. Вы можете обойти эту проблему, но вы, вероятно, столкнетесь с следующим. Я настоятельно рекомендую изменить структуру, так как другие октавные функции и другое программное обеспечение будут сталкиваться с подобными проблемами.

Если вы действительно не можете изменить структуру, попробуйте создать символические ссылки, чтобы иметь альтернативную более короткую структуру.

+0

Спасибо за ваш ответ. Я увижу, могу ли я изменить хотя бы имена файлов на что-то более короткое. Я еще не слышал о символических ссылках, не могли бы вы объяснить, как это сделать или по крайней мере указать мне на соответствующие ресурсы? – am304

+0

В принципе, вы создаете символическую ссылку 'P: \ short \' для 'P: \ 9xxxProjects \ blabla \ blabla \ blabla \ blabla', поэтому вы можете использовать' P: \ short' вместо длинного имени.Поскольку оба объекта указывают на один и тот же объект файловой системы, содержимое идентично. Если вы используете проверку NTFS «символическая ссылка NTFS» и «точка соединения NTFS» https://en.wikipedia.org/wiki/NTFS_symbolic_link https://en.wikipedia.org/wiki/NTFS_junction_point – Daniel

+0

@ am304 Я не иметь систему Windows, чтобы проверить ее, но связанная с ней документация говорит о том, что на пути должен работать предварительно ожидающий '\\? \'. Вы пробовали '\\? \ C: \ your_very_long_filepath'? – carandraug