DuplicateHandle для файла - PullRequest
       0

DuplicateHandle для файла

0 голосов
/ 14 июля 2011

Я пытаюсь сделать DuplicateHandle () для файла, который пишет другой процесс. Мне это удалось, но я получил должность владельца процесса. После того, как я стремлюсь к началу, он ищет и в процессе владельца. Можно ли как-то искать без изменения прогресса первого процесса?

EDIT:

Другое приложение открывает этот файл без CreateFile. Есть ли способ прочитать файл с самого начала с помощью ReadFile без ручного поиска?

ИЗМЕНИТЬ еще раз:

Нет способа читать только с одной стороны с дублированным дескриптором. Спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 14 июля 2011

С MSDN :

Дублирующий дескриптор ссылается на тот же объект, что и оригинальный дескриптор.Поэтому любые изменения объекта отражаются через обе ручки.Например, если вы дублируете дескриптор файла, текущая позиция файла всегда одинакова для обоих дескрипторов.Чтобы дескрипторы файлов имели разные позиции, используйте функцию CreateFile для создания файловых дескрипторов, которые имеют общий доступ к одному и тому же файлу.

2 голосов
/ 14 июля 2011

Вместо DuplicateHandle вы должны вызывать CreateFile в обоих процессах с правильной комбинацией режима доступа и флага совместного использования.MSDN имеет полный набор правил , вот комбинация, которая работает:

Процесс записи:

 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;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...