2017-01-28 2 views
1

Я использую следующий код из Microsoft в качестве шаблона:Почему я не могу создать сопоставление файлов с текстовым файлом?

#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 
#include <tchar.h> 

#define BUF_SIZE 256 
TCHAR szName[]=TEXT("Global\\MyFileMappingObject"); 
TCHAR szMsg[]=TEXT("Message from first process."); 

int _tmain() 
{ 
    HANDLE hMapFile; 
    LPCTSTR pBuf; 

    hMapFile = CreateFileMapping(
       INVALID_HANDLE_VALUE, // use paging file 
       NULL,     // default security 
       PAGE_READWRITE,   // read/write access 
       0,      // maximum object size (high-order DWORD) 
       BUF_SIZE,    // maximum object size (low-order DWORD) 
       szName);     // name of mapping object 

    if (hMapFile == NULL) 
    { 
     _tprintf(TEXT("Could not create file mapping object (%d).\n"), 
      GetLastError()); 
     return 1; 
    } 
    pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object 
         FILE_MAP_ALL_ACCESS, // read/write permission 
         0, 
         0, 
         BUF_SIZE); 

    if (pBuf == NULL) 
    { 
     _tprintf(TEXT("Could not map view of file (%d).\n"), 
      GetLastError()); 

     CloseHandle(hMapFile); 

     return 1; 
    } 


    CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR))); 
    _getch(); 

    UnmapViewOfFile(pBuf); 

    CloseHandle(hMapFile); 

    return 0; 
} 

И это прекрасно работает, но я хочу использовать файл с именем file.txt вместо файла подкачки, так что я думаю, что эти изменения должны быть достаточно :

ficheroACompartir=CreateFile("file.txt",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 

    if (ficheroACompartir==INVALID_HANDLE_VALUE) 
    { 
     printf("Could not open file\n"); 
     getchar(); 
    } 
    else 
    { 
     printf("File opened correctly\n"); 
     ReadFile(ficheroACompartir,buff,4096,&dwBytesRead,NULL); 
     printf("%s\n",&buff); //double check that the file is opened correctly in case I'm forgetting something, content displays fine 

     //CloseHandle(ficheroACompartir); 
    } 

    hMapFile = CreateFileMapping(
       ficheroACompartir, // use my file 
       NULL,     // default security 
       PAGE_READWRITE,   // read/write access 
       0,      // maximum object size (high-order DWORD) 
       BUF_SIZE,    // maximum object size (low-order DWORD) 
       szName);     // name of mapping object 

Но эти изменения не работают, я получаю сообщение об ошибке «Невозможно создать файл сопоставления объектов».

Что мне не хватает?

ответ

2

Когда вы вызываете CreateFile, чтобы открыть текстовый файл, вы указываете, что хотите получить доступ к нему только для чтения (GENERIC_READ), поэтому возвращаемый дескриптор файла имеет доступ только к файлу. Когда вы затем создаете сопоставление файлов с ним, вы указываете, что хотите доступ для чтения/записи. Поскольку дескриптор файла имеет доступ только для чтения, это невозможно, и сопоставление файлов не выполняется.

Вместо этого измените второй параметр вашего CreateFile на GENERIC_READ | GENERIC_WRITE.

+0

Вы правы, я забыл об этом. Благодаря! – user2638180

+0

Кроме того, это четко указано в документации ['CreateFileMapping()') (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537.aspx): «* PAGE_READWRITE 0x04: разрешает просмотр для сопоставления только для чтения, копирования-на-записи или доступа для чтения/записи. ** Параметр файла, указанный параметром hFile, должен быть создан с правами доступа GENERIC_READ и GENERIC_WRITE **. * «Когда' CreateFileMapping() 'failed,' GetLastError() 'должен был сказать вам, что у вас есть несоответствие в правах доступа. ВСЕГДА проверяйте коды ошибок, когда они доступны! –

Смежные вопросы