현재 옥타브 (Windows의 경우 3.8.0)에 작은 프로그램을 작성하여 디렉토리 구조를 구문 분석하고 해당 구조의 파일에서 일부 데이터를 검색합니다. 관심있는 파일이 항상 동일한 일관된 위치에있는 것은 아니므로 검색해야하며 이렇게하려면 dir
기능을 광범위하게 사용합니다.옥타브에서 파일 이름이 너무 깁니다.
나는 해결 방법을 모르는 문제에 대해 제기했습니다. 일부 파일의 경우, 나는 Dir 함수를 호출하는 다음과 같은 경고 얻을 :
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:\
드라이브 (C:\Test
)에 테스트 디렉토리를 만들고, 파일을 복사하고, 다른 것을 변경하지 않고 (즉, 파일 이름을 변경하지 않고) 동일한 코드를 실행했습니다. 그것은 괜찮 았는데, 아무 문제도 dir
와 함께 달렸다.
dir
이 지원하는 최대 경로/파일 길이가 있습니까? 이 문제를 해결하려면 어떻게해야합니까? 디렉토리 구조 나 파일 이름의 명명 규칙을 변경할 수 없습니다. 문제가되는 디렉토리에 대한 경로의 길이는 177이고, 문제를 일으키는 파일 이름의 길이는 84이므로 결합 된 길이는 261입니다. 동일한 디렉토리에있는 길이가 81 인 다른 파일 (길이가 258이기 때문에) 잘 작동합니다. 코드의 최대 길이는 260 자입니다.
나는 dir
에 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
:
여기
[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
를 호출 할 때 내가 무엇을 얻을
불행히도 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/octave/file/c304687571c8/libinterp/corefcn/syscalls.cC# l782). 이 후에 Octave를 다시 빌드해야합니다. 어쨌든, 이미 언급했듯이, 그러한 긴 파일 경로는 Windows 시스템에서 제대로 작동하지 않습니다. – carandraug