В настоящее время я пишу небольшую программу в 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
являются встроенными/скомпилированными функциями, поэтому я не могу их редактировать. Может ли кто-нибудь предложить обходное решение?
вы говорите: «... 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