2010-07-30 5 views
1

메신저 데이터 findfirstfile 출력을 저장하기 위해 WIN32_FIND_DATA를 사용합니다. 나는 파일 위치 (C : \ file)를 문자열로 원하지만 그 파일이나 다른 데이터를 가져 오는 방법을 모른다.WIN32_FIND_DATA를 (를) 문자열로 변환하는 방법은 무엇입니까?

편집 : 여기

PTSTR pszFileName; 
PTSTR pszFileName2[100]; 
if (search_handle) 
{ 
    do 
    { 
     pszFileName = file.cFileName; 
     pszFileName2[loop] = pszFileName; 
     Sleep(100); 
     loop++; 

     std::wcout << file.cFileName << std::endl; 
    } 
    while(FindNextFile(search_handle,&file)); 

    CloseHandle(search_handle); 
} 
+0

어떤 참고 자료를 사용하십니까? 해당 데이터 유형을 언급했지만 내용을 설명하지 않으면 다른 사람에게 해당 자원을 절대 추천하지 말아야한다는 메모를 작성해야합니다. MSDN 사용을 고려해야합니다. –

답변

6

WIN32_FIND_DATA이 구조체 내 코드입니다. cFileName 회원을 확인하십시오. 예를 들어

: 코멘트

문자열의 저장 스택에이 예에서

, 동일한 완충액에 응답

WIN32_FIND_DATA FindData = {0}; 
HANDLE hFind = FindFirstFile(pszPattern, &FindData); 

if (hFind != INVALID_HANDLE_VALUE) 
{ 
    do 
    { 
     PTSTR pszFileName = FindData.cFileName; 

     // TODO: Use pszFileName in some way... 

    } while (FindNextFile(hFind, &FindData)); 

    FindClose(hFind); 
} 

업데이트는 모든 호출에 사용된다. 즉, 모든 FindNextFile()은 이전 문자열을 덮어 씁니다. 문자열의 복사본을 만들어야합니다.

당신이 std에서 C++와 클래스를 사용하고 있기 때문에 나는 당신이 (당신이 UNICODE_UNICODE을 정의하고 wstring를 사용해야합니다., 더 나은 아직 나) 할당을 수행하는 새로운 string 클래스를 초기화하고에 복사 std::string에 저장 제안 너를 위해서. (: + memcpymalloc, strdup 또는 유사한을 사용하여, 예를 들면),하지만 당신은 문자열, 포인터의 재교육을 할 수 있습니다 것 같은데, 그리고 C에서 메모리 할당 전에

은 다른 방법은 일반적인 C 기술을 사용하여 문자열을 복사 할 수 있습니다 너는 그것에 가야 해.

그런데 오류를 확인하기 위해 코드에서 찾기 핸들을 NULL과 비교합니다. 이것은 잘못되었습니다. FindFirstFile()은 실패시 INVALID_HANDLE_VALUE ((HANDLE)-1까지 해결)을 반환합니다. 또한 핸들을 닫으려면 FindClose()을 사용하고 CloseHandle()을 사용하지 않는 것이 좋습니다. ("find handle"은 실제로 파일 핸들, 모듈 핸들, 쓰레드 또는 프로세스 핸들과 같은 의미의 커널 객체에 대한 핸들이 아닙니다. 방금 유형을 오버로드했습니다.)

+0

그것은 잘 작동하지만 배열에 넣을 수는 없습니다 (내 코드를보십시오). 난 그냥 같은 파일을 얻을, 그것은 각 파일에 대해 하나의 배열을 사용하지만 그들은 모두 마지막 파일의 이름을 가지고 – blood

+0

@ 혈액 - 귀하의 의견에 과거 대답을 업데이 트되었습니다. – asveikau

1

문제는 배열에 파일 이름의 주소를 저장한다는 것입니다. FindNextFile()이 호출 될 때마다 구조체의 데이터가 다음 파일의 정보로 바뀝니다. 배열의 문자열에 메모리를 할당 한 다음 구조체의 문자열을 배열에 복사해야합니다 (아마도 strncpy_s()과 같은 것을 사용합니다).

코드는 발견 된 파일 당 한 번만 struct의 파일 이름 멤버에 대한 포인터를 저장합니다. 배열의 각 요소가 가리키는 주소를 보면 모든 요소가 같은 위치를 가리키고 있습니다.

+0

o :(데이터를 복사하는 방법은 무엇입니까?) – blood

+0

@blood 매우 큰 주제인데, 여기에 답을 담는 것이 어려울 것입니다. @asveikau를 되풀이합니다. 포인터와 문자열을 새로 고침해야합니다. C/C++에서 작동합니다. – Andy

관련 문제