2011-07-14 30 views
0

我正在嘗試爲另一個進程寫入的文件創建DuplicateHandle()。我成功了,但我得到了所有者流程的位置。在我尋求開始之後,它也會尋求所有者的過程。我能以某種方式尋求而不改變第一個過程的進展嗎?DuplicateHandle文件

編輯:

另一個應用程序打開該文件,而無需的CreateFile。這是一種從ReadFile開始讀取文件的方式,無需手動查找?再次

編輯:

沒有讀僅從一側重複處理的方式。感謝您的幫助。

+2

這似乎是'Dup的預期行爲licateHandle()'。如果原始進程以「共享讀取」訪問權限打開文件,那麼您是否可以使用常規方式簡單地打開文件?你有具體的理由在這裏使用'DuplicateHandle()'嗎? – Chad

+0

閱讀我的最新評論。 – blez

回答

3

MSDN

重複的手柄是指相同的對象原裝手柄。因此,對象的任何更改都會反映在兩個句柄中。例如,如果複製文件句柄,則兩個句柄的當前文件位置始終相同。要使文件句柄具有不同的文件位置,請使用CreateFile函數創建共享對同一文件的訪問權限的文件句柄。

+0

我可以創建另一個處理,它引用另一個位置。因爲我使用DuplicateHandle,所以我可以複製另一個進程的句柄,所以我可以訪問句柄? – blez

+1

是的。從重複的句柄中,獲取文件名('GetFinalPathNameByHandle'),並將該文件名傳遞給'CreateFile'以獲得獨立句柄。 – MSalters

+0

我已經知道文件名,問題是我無法打開文件:CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); – blez

2

而不是DuplicateHandle,您必須在兩個進程中調用CreateFile,並使用訪問模式和共享標誌的正確組合。 MSDN有full set of rules,這裏是一個可行的組合:

作家過程:

HANDLE file = CreateFile(..., GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, ...); 

讀取器進程:

HANDLE file = CreateFile(..., GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, ...); 

如果需要使用標誌玩,這裏是(原油)測試應用程序我寫回答你的問題:

// 2process1file.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <Windows.h> 
#include <stdio.h> 
#include <tchar.h> 

#define NUMBER_OF_LINES 100 
#define IO_PERIOD 250 
static const char message[] = "The quick brown fox jumps over the lazy dog.\n"; 

HANDLE file = INVALID_HANDLE_VALUE; 

BOOL CtrlHandler(DWORD ctltype) 
{ 
    if(file != INVALID_HANDLE_VALUE) 
    { 
     CloseHandle(file); 
     file = INVALID_HANDLE_VALUE; 
    } 

    return FALSE; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    if(argc == 3) 
    { 
     DWORD access = GENERIC_READ; 
     DWORD share = FILE_SHARE_READ; 
     bool is_writer = false; 

     if((*argv[1]|' ') == 'w') 
     { 
      access |= GENERIC_WRITE; 
      is_writer = true; 
     } 
     else 
     { 
      share |= FILE_SHARE_WRITE; 
     } 

     file = CreateFile(argv[2], access, share, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 

     if(file != INVALID_HANDLE_VALUE) 
     { 
      DWORD nbytes = 1; 

      SetFilePointer(file, 0, 0, FILE_BEGIN); //Redundant when writing 

      for(int i=0; (i<NUMBER_OF_LINES) && nbytes; ++i) { 
       if(is_writer) { 
        if(WriteFile(file, message, sizeof(message)-1, &nbytes, 0) == 0) 
        { 
         //Write failed somehow 
         break; 
        } 

        //Sleep(INFINITE); 

        if(i%25 == 0) printf("%d\n", i); 
       } else { 
        char buffer[sizeof message] = ""; 

        if(ReadFile(file, buffer, sizeof(buffer)-1, &nbytes, 0) && nbytes) { 
         buffer[sizeof(buffer)-1] = 0; 
         printf(buffer); 
        } else { 
         //Read failed somehow 
         break; 
        } 
       } 

       Sleep(IO_PERIOD); 
      } 

      CloseHandle(file); 
      file = INVALID_HANDLE_VALUE; 
     } 
    } 
    else 
    { 
     wprintf(L"Usage : %s [w|r] filename\n"); 
    } 

    return 0; 
} 
+0

問題在於,在主應用程序正在寫入文件時,該文件被讀取保護。這就是我製作DuplicateHandle()的原因。 (我不確定共享標誌) – blez

+0

這是訪問模式和共享標誌的組合。查看更新的帖子。 – ixe013

+0

使用您的代碼,我得到:進程無法訪問該文件,因爲它正在被另一個進程使用。 – blez