2012-03-06 147 views
2

我寫了一個小程序,經常打開小的用戶文本文件,直到現在還沒有遇到任何讀/寫訪問或任何衝突問題。這些文件是在另一個我無法控制的軟件中選擇的,並以字符串形式傳給我。爲什麼CreateFile無法通過網絡共享打開文件?

當試圖從映射的網絡驅動器打開文件時我得到一個「系統找不到指定的路徑」錯誤(GetLastError()= 3)。

該調用顯示如下,*iNCfileName = "z:\\Validation\\Sample Files\\1_1-4 120MM.CC",其中Z:是我們域上的映射文件夾。

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 2012-03-06 16:28:44

+0

調用GetLastError()並獲取特定的失敗值。 – 2012-03-06 16:29:01

+0

除了'GetLastError()',你能顯示'iNCfileName'的填充。 – hmjd 2012-03-06 16:29:47

回答

1

我以前遇到過這一點。當使用像\\DOMAIN\PATH\FILE.TXT這樣的路徑時,我必須先撥打WNetAddConnection2()

這裏是我的代碼(當然你也可以排除NULL成員):

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 

不要忘了頭文件和庫。

+0

你找到一種方法來編程確定文件是本地還是遠程,或者你知道你總是訪問遠程文件嗎? – Stephen 2012-03-06 20:07:43

+0

我實際上正在測試一些創建並寫入我帳戶上來自其他人帳戶的文件的內容。然而,以我自己的帳戶運行它卻產生了完全相同的結果。有一點需要注意的是,運行該程序的帳戶必須具有對目標的正確訪問權限。 – chris 2012-03-06 20:36:01

+0

是的,我可以通過Windows資源管理器訪問文件,編輯它們,無論我想要手動。 – Stephen 2012-03-06 20:37:19

-1

我剛剛有同樣的問題;試圖在映射的驅動器(Z:\folder)下使用API​​ CreateFileW創建文件不起作用; howerver,研究這個問題後,我試圖用真正的路徑創建文件(\\Shared_computer_name\folder\)立即成功工作。

現在我必須工作一個函數來檢索映射驅動器的真實名稱,以便在必要時使用它......剛發現WNetGetUniversalName,必須使其工作。