2015-01-09 2 views
2

현재 옥타브 (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 자입니다.

나는 dirlstatstat에 전화로 문제를 좁혀 :

>> [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 

나는 내 문제 파일/디렉토리로 lstatstat를 호출 할 때 내가 무엇을 얻을

불행히도 statlstat은 내장/컴파일 된 함수이므로 편집 할 수 없습니다. 아무도 해결 방법을 제안 할 수 있습니까?

+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/octave/file/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 연결 지점을 확인하는 경우 https://en.wikipedia.org/wiki/NTFS_symbolic_link https://en.wikipedia.org/wiki/NTFS_junction_point – Daniel

+0

@ am304 그렇지 않습니다. 그것을 테스트하는 윈도우 시스템을 가지고 있지만 링크 된 문서는 경로에 대해 미리 보류중인'\\? \ '가 작동해야한다고 제안합니다. '\\? \ C : \ your_very_long_filepath'을 시도 했습니까? – carandraug

관련 문제