2011-03-10 68 views
0

我有一個作爲Windows服務運行的應用程序,它想要讀取由相對路徑指定的文件。由於服務is running under C:\Windows\system32(在Server 2003和Windows 7上),我想它應該從那裏讀取文件。但是,文件讀取總是失敗。Windows服務是否限制從%WINDIR%(C: Windows)讀取?

我把一些簡單的測試代碼放在一起,嘗試使用絕對路徑打開文件進行讀取。雖然服務成功的文件,如C:\ TEMP \ foo.txt的,它總是失敗像C文件:\ WINDOWS \ foo.txt的C:\ WINDOWS \ SYSTEM32 \ foo.txt的GetLastError()返回2

我是否遇到訪問問題?我找不到關於此的權威性文檔。有什麼解決方法嗎?

更新:

文件測試代碼是通用的,簡單明瞭:

std::ofstream out; 
//... 

std::string fileName("C:\\Windows\\system32\\Foo.txt"); 

hFile = CreateFile(fileName.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

if (hFile == INVALID_HANDLE_VALUE) { 
    out << "Could not create file handle! (" << GetLastError() << ")" << std::endl; 
} 
else { 
    out << "Successfully opened file!" << std::endl; 
    CloseHandle(hFile); 
} 
+0

@ Haw-Bin:粘貼失敗代碼的相關部分。 2意味着某些路徑錯誤('ERROR_FILE_NOT_FOUND':找不到文件)。 – 0xC0000022L 2011-03-10 16:55:37

+0

哇!剛剛偶然發現了微軟關於「文件系統重定向」的文章,至少可以解釋這個問題。 http://msdn.microsoft.com/en-us/library/aa384187(v=VS.85).aspx – 2011-03-10 16:57:09

+0

@ Haw-Bin:不,它不。在正常情況下,服務流程不會受到FS虛擬化的限制。 – 0xC0000022L 2011-03-10 17:00:21

回答

0

錯誤代碼2是ERROR_FILE_NOT_FOUND所以它更有可能的是你給簡單的路徑不存在或文件不存在那條路。沒有來自CreateFile的相關標誌,很難給你一個更好的答案。

但通常 - 在默認條件下 - 服務將被允許在該文件夾中讀取。

還有一件事浮現在腦海。你如何獲得路徑(在你的情況下爲C:\Windows)?正確的方法是使用API​​(例如GetWindowsDirectory),而不是對其進行硬編碼。

+0

謝謝 - 我只對我的測試進行硬編碼,因爲我在機器上檢查了'%WINDIR%'的值。 – 2011-03-10 17:18:10

0

嘗試從本地系統帳戶運行Windows服務。默認情況下,服務可能正在從「網絡服務」帳戶運行。 要更改設置,請打開Windows服務管理器(運行 - > services.msc),然後雙擊您的服務。在屬性窗口中選擇第二個選項卡「登錄」並將其更改爲使用本地系統帳戶運行。

+0

它在兩個環境中的「本地系統帳戶」下運行,並且「允許服務與桌面交互」未選中。 – 2011-03-10 17:09:50