2012-03-06 3 views
2

작은 사용자의 텍스트 파일을 자주 열어 줘서 지금까지는 읽기/쓰기 액세스 또는 모든 충돌 문제가 발생하지 않은 작은 프로그램을 작성했습니다. 파일은 내가 제어 할 수없는 다른 소프트웨어에서 선택되며 문자열로 전달됩니다.CreateFile이 네트워크 공유를 통해 파일을 열지 못하는 이유는 무엇입니까?

매핑 된 네트워크 드라이브에서 파일을 열려고하면 "지정한 경로를 찾을 수 없습니다"오류 (GetLastError() = 3)가 발생합니다.

전화 번호는 *iNCfileName = "z:\\Validation\\Sample Files\\1_1-4 120MM.CC"입니다. 여기서 Z는 Google 도메인의 매핑 된 폴더입니다.

iNCfile = CreateFile(iNCfileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); 
if (iNCfile == INVALID_HANDLE_VALUE) 
{ 
    string msg; // lots of better ways to get this printed ... but ... 
    dw = GetLastError(); 
    msg = iNCfileName; 
    msg += ": "; 
    msg += _com_error(dw).ErrorMessage(); 
    print_error(dw , (char*)msg.c_str()); 
    return 102; 
} 

로컬 하드 드라이브에 파일을 복사하면 파일이 내 프로그램에서 열립니다. 또한 매핑 된 드라이브의 메모장에서 열립니다.

매핑 된 표현 "Z : \ whatever.txt"와 실제 파일 이름 (\ mydomain \ Validation \ S .... ") 사이에 문제가있을 수 있습니까?

만약 그렇다면 어떻게 프로그램 방식으로 하나에서 다른 것으로 변환 할 수 있습니까? (도메인/공유 이름을 미리 알지 못한다고 가정)

VS2010을 사용하면 응용 프로그램이 Win XP 컴퓨터에서 실행됩니다.

관련이 : my follow up question

+9

나중에 반복하십시오 : "GetLastError()'를 사용합니다." – 0xC0000022L

+0

GetLastError()를 호출하여 특정 실패 값을 얻습니다. –

+0

'GetLastError()'외에도'iNCfileName'의 채우기를 표시 할 수 있습니까? – hmjd

답변

1

내가 전에이 발생했습니다. \\DOMAIN\PATH\FILE.TXT과 같은 경로를 사용할 때는 먼저 WNetAddConnection2()으로 전화해야했습니다.

NETRESOURCE nr = {0}; //new structure for network resource 
nr.dwType = RESOURCETYPE_ANY; //generic resource (any type allowed) 
nr.lpLocalName = NULL; //does not use a device 
nr.lpRemoteName = "\\\\DOMAIN\\PATH\\FOLDER"; //For me, this pointed to an account's documents folder, and from there I could use a subfolder 
nr.lpProvider = NULL; //no provider 

DWORD ret = WNetAddConnection2 (&nr, NULL, NULL, CONNECT_TEMPORARY); //add connection 

헤더 및 라이브러리를 잊지 마세요 :

여기에 (물론 당신이 NULL 회원을 제외 할 수 있습니다) 내 코드입니다.

+0

파일이 로컬 또는 원격인지 프로그래밍 방식으로 확인하거나 사용자가 항상 원격 파일에 액세스하고 있음을 알고 있습니까? – Stephen

+0

저는 실제로 다른 사람의 계정에서 내 계정의 파일에 작성하여 작성한 것을 테스트하고있었습니다. 내 계정에서 실행하면 똑같은 결과가 나타납니다. 한 가지주의 할 점은 프로그램을 실행하는 계정에는 대상에 대한 올바른 액세스 권한이 있어야한다는 것입니다. – chris

+0

예, Windows 탐색기를 통해 파일에 액세스하고 편집 할 수 있습니다. – Stephen

-1

방금 ​​같은 문제가있었습니다. 매핑 된 드라이브 (Z:\folder) 아래에서 API CreateFileW을 사용하여 파일을 만들려고했지만 작동하지 않았습니다. howerver,이 주제를 연구 한 후 실제 경로 (\\Shared_computer_name\folder\)를 사용하여 파일을 만들려고했지만 즉시 성공했습니다.

이제 맵핑 된 드라이브의 실제 이름을 검색하여 필요할 때 사용하는 기능을 수행해야합니다. 그냥 찾았습니다. WNetGetUniversalName이 작동하도록 만들어야합니다.

관련 문제