Createfilemapping error 1006

I have this code that has been generously supplied by the user RLWA32. The following is the top of the file, a fraction. I changed the function name because I need to call it from another file.
  • Remove From My Forums
  • Question

  • I have this code that has been generously supplied by the user RLWA32. The following is the top of the file, a fraction. I changed the function name because I need to call it from another file.

    int Sending_To_SSD()
    	{
    		// Create a 0 byte, empty file
    		HANDLE hFile = CreateFile(_T("SphHarm.dat"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    		if (hFile == INVALID_HANDLE_VALUE)
    		{
    			_tprintf_s(_T("CreateFile failed with error %dn"), GetLastError());
    			return 1;
    		}
    
    		DWORD dwMaxSize = MAX_FLOATS * sizeof(float);
    		HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwMaxSize, NULL);
    
    		if (!hMap)
    		{
    			_tprintf_s(_T("CreateFileMapping failed with error %dn"), GetLastError());
    			return 1;
    		}
    
    		// map the entire file into the view
    		float* pfArray = (float*)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    
    		if (!pfArray)
    		{
    			_tprintf_s(_T("MapViewOfFile failed with error %dn"), GetLastError());
    			return 1;
    		}

    I also did a little surgery, removed comments and a printf statement. I wonder why the map file cannot be created? Thanks, — MyCatAlex

    • Edited by

      Sunday, April 12, 2020 6:51 PM

Answers

  • Try writing a byte to the file after CreateFile succeeds but before you call CreateFileMapping.

    For example,

    BYTE buf = '';
    DWORD dwWritten = 0;
    WriteFile(hFile, &buf, sizeof buf, &dwWritten, NULL);
    
    

    I’m wondering if CreateFileMapping behaves differently when the file to be mapped resides on an SSD that is not using the NTFS file system.

    • Marked as answer by
      MyCatAlex
      Sunday, April 12, 2020 11:07 PM

    • Edited by
      WayneAKing
      Sunday, April 12, 2020 10:58 PM
    • Marked as answer by
      MyCatAlex
      Sunday, April 12, 2020 11:07 PM

I have a problem with mapping a .txt file to memory that doesn’t have any inserted data yet, but I keep getting error 1006 when calling the CreateFileMapping function. I have already resolved the mapping to memory for Linux and now I wanted to convert it to Windows, but I can’t figure it out.

This is the code for Linux:

// Open the output file
int output_file = open(argv[2], O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (!output_file) {
  printf("Unable to create file.");
  exit(1);
}

// Get the size of the output file
size_t output_file_size = strlen(input_data_without_comments);

// Set length to file
ftruncate(output_file, output_file_size);

// Map the output file into memory
char *output_data = mmap(NULL, output_file_size, PROT_WRITE, MAP_SHARED, output_file, 
0);
if (output_data == MAP_FAILED) {
  printf("Error: failed to map output filen");
  exit(1);
}

This is code for windows that I have:

// Open the output file
printf("Open the output filen"); 
HANDLE output_file = CreateFile(argv[2], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 
NULL, CREATE_ALWAYS, 0, NULL);
if (output_file == INVALID_HANDLE_VALUE) {
  _tprintf(_T("Error: could not open output file '%s'n"), argv[2]);
  exit(1);
}

// Initializing variables for output length
DWORD output_file_size = 0;
DWORD high_output_file_size = 0;

// Get length of the output file
output_file_size = GetFileSize(output_file, &high_output_file_size);
printf("Size of the output_file: %dn", output_file_size);

// Output file mapping
printf("Output file mappingn"); 
HANDLE output_file_mapping = CreateFileMapping(output_file, NULL, PAGE_READWRITE, 0, 0, 
NULL);
if (output_file_mapping == NULL) {
  _tprintf(_T("Unable to create file mapping (output_file)n"));
  _tprintf(_T("Last error was: %i"), GetLastError());
  exit(1);
}

// Set length to file
printf("Set length to filen");
SetFilePointer(output_file, output_file_size, NULL, FILE_BEGIN);
SetEndOfFile(output_file);

// Map the output file into memory
printf("Map the output file into memoryn");
char *output_data = MapViewOfFile(output_file_mapping, FILE_MAP_WRITE, 0, 0, 
output_file_size);
if (output_data == NULL) {
  printf("Error: failed to map output filen");
  exit(1);
}

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    !
    Правила раздела Visual C++ / MFC / WTL (далее Раздела)

    >
    Отображение файла в память

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    05.04.08, 19:51

      Full Member

      ***

      Рейтинг (т): 9

      Есть код:

      ExpandedWrap disabled

        HANDLE file = CreateFile(FILENAME, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

            if(file == NULL)

            {

                printf(«Couldn’t create synchronization file. Code: %dn», GetLastError());

            }  

            else

            {

                fMapping = CreateFileMapping(file, NULL, PAGE_READWRITE, 0, 0, NULL);  

                if(fMapping == NULL)

                {

                    printf(«CreateFileMapping() error. Code: %dn», GetLastError());

                }

            }

      При запуске выдается ошибка:

      ExpandedWrap disabled

        CreateFileMapping() error. Code: 1006

      В чем может быть проблема и что это за ошибка 1006?


      Hryak



      Сообщ.
      #2

      ,
      05.04.08, 20:01

        Нельзя мапить файл нулевого размера — скорее всего, в этом у тебя ошибка.

        Добавлено 05.04.08, 20:07
        А, сразу не заметил CREATE_ALWAYS.. Тогда не «скорее всего», а точно дело в этом.


        albom



        Сообщ.
        #3

        ,
        05.04.08, 20:33

          Senior Member

          ****

          Рейтинг (т): 20

          Цитата Вован Каширский @ 05.04.08, 19:51

          что это за ошибка 1006?

          ERROR_FILE_INVALID
          А вообще, есть функция FormatMessage, которая расскажет о ошибке.
          Пример из MSDN:

          ExpandedWrap disabled

            void ErrorExit(LPTSTR lpszFunction)

            {

                TCHAR szBuf[80];

                LPVOID lpMsgBuf;

                DWORD dw = GetLastError();

                FormatMessage(

                    FORMAT_MESSAGE_ALLOCATE_BUFFER |

                    FORMAT_MESSAGE_FROM_SYSTEM,

                    NULL,

                    dw,

                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

                    (LPTSTR) &lpMsgBuf,

                    0, NULL );

                wsprintf(szBuf,

                    «%s failed with error %d: %s»,

                    lpszFunction, dw, lpMsgBuf);

                MessageBox(NULL, szBuf, «Error», MB_OK);

                LocalFree(lpMsgBuf);

                ExitProcess(dw);

            }

          Цитата Вован Каширский @ 05.04.08, 19:51

          if(file == NULL)

          CreateFile возвращает в случае ошибки INVALID_HANDLE_VALUE, а совсем не NULL

          Сообщение отредактировано: albom — 05.04.08, 20:35

          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

          0 пользователей:

          • Предыдущая тема
          • Visual C++ / MFC / WTL
          • Следующая тема

          Рейтинг@Mail.ru

          [ Script execution time: 0,0275 ]   [ 16 queries used ]   [ Generated: 9.02.23, 09:28 GMT ]  

          • .NET

          • Syntax Specific

          • Visual C++ .NET

          You are using an out of date browser. It may not display this or other websites correctly.
          You should upgrade or use an alternative browser.

          CreateFileMapping failed with error 1006


          • Thread starter

            MyCatAlex


          • Start date

            Apr 12, 2020

          MyCatAlex


          • #1

          I have this code that has been generously supplied by the user RLWA32. The following is the top of the file, a fraction. I changed the function name because I need to call it from another file.

          int Sending_To_SSD()
          {
          // Create a 0 byte, empty file
          HANDLE hFile = CreateFile(_T(«SphHarm.dat»), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
          if (hFile == INVALID_HANDLE_VALUE)
          {
          _tprintf_s(_T(«CreateFile failed with error %dn»), GetLastError());
          return 1;
          }

          DWORD dwMaxSize = MAX_FLOATS * sizeof(float);
          HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwMaxSize, NULL);

          if (!hMap)
          {
          _tprintf_s(_T(«CreateFileMapping failed with error %dn»), GetLastError());
          return 1;
          }

          // map the entire file into the view
          float* pfArray = (float*)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);

          if (!pfArray)
          {
          _tprintf_s(_T(«MapViewOfFile failed with error %dn»), GetLastError());
          return 1;
          }

          I also did a little surgery, removed comments and a printf statement. I wonder why the map file cannot be created? Thanks, — MyCatAlex

          Continue reading…

          • .NET

          • Syntax Specific

          • Visual C++ .NET

          • This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
            By continuing to use this site, you are consenting to our use of cookies.


          CreateFileMapping и указание размера файла

          От: Аноним

           
          Дата:  11.02.10 09:35
          Оценка:

          В случае создания файла для записи в CreateFileMapping необходимо передавать dwMaximumSizcLow ненулевые значения размера файла, иначе ошибка GetLastError() = 1006. Как быть если размер файла еще не известен, то есть мы принимаем данные по сети и хотелось бы сразу класть их в файл.
          Как инициализировать CreateFileMapping() чтобы принимать данные с неизвестным заранее размером ?

          Можно конечно создать буфер в памяти и туда сначала принять данные и потом когда будет известен размер слить в mapping, но хотелось бы без посредников обойтись


          Re: CreateFileMapping и указание размера файла

          От:

          Pavel Dvorkin

          Россия

           
          Дата:  11.02.10 10:25
          Оценка:

          Здравствуйте, Аноним, Вы писали:

          А>В случае создания файла для записи в CreateFileMapping необходимо передавать dwMaximumSizcLow ненулевые значения размера файла, иначе ошибка GetLastError() = 1006. Как быть если размер файла еще не известен, то есть мы принимаем данные по сети и хотелось бы сразу класть их в файл.

          А>Как инициализировать CreateFileMapping() чтобы принимать данные с неизвестным заранее размером ?

          Никак. Но можно заказать мэппинг на верхнюю границу, а потом, когда все кончится — закрыть мэппинг и урезать файл (SetFilePointer, SetEndOfFile).

          With best regards
          Pavel Dvorkin


          Re: CreateFileMapping и указание размера файла

          От:

          Qa1888

           
          Дата:  11.02.10 10:25
          Оценка:

          Создать какой-то, если не хватает места то выделять новый в 2 раза больше и копировать туда, старый убивать. Посредников не будет, правда будет копирование

          А>В случае создания файла для записи в CreateFileMapping необходимо передавать dwMaximumSizcLow ненулевые значения размера файла, иначе ошибка GetLastError() = 1006. Как быть если размер файла еще не известен, то есть мы принимаем данные по сети и хотелось бы сразу класть их в файл.

          А>Как инициализировать CreateFileMapping() чтобы принимать данные с неизвестным заранее размером ?

          А> Можно конечно создать буфер в памяти и туда сначала принять данные и потом когда будет известен размер слить в mapping, но хотелось бы без посредников обойтись


          Re[2]: CreateFileMapping и указание размера файла

          От:

          Pavel Dvorkin

          Россия

           
          Дата:  11.02.10 10:28
          Оценка:

          Здравствуйте, Qa1888, Вы писали:

          Q>Создать какой-то, если не хватает места то выделять новый в 2 раза больше и копировать туда, старый убивать. Посредников не будет, правда будет копирование

          Мне эта идея совсем не по душе, но уж если ее рассматривать — копировать-то зачем ? Закрываем мэпинг и открываем его заново на том же файле, указав в 2 раза большую длину.

          With best regards
          Pavel Dvorkin


          Re[3]: CreateFileMapping и указание размера файла

          От:

          Qa1888

           
          Дата:  11.02.10 11:27
          Оценка:

          Если файл физически на диске, то да — записали, закрыли, спроецировали повторно, подали хендл. А если открывали для обмена данными между процессами и первый параметр INVALID_HANDLE_VALUE, то как вы повторно откроете?

          PD>Мне эта идея совсем не по душе, но уж если ее рассматривать — копировать-то зачем ? Закрываем мэпинг и открываем его заново на том же файле, указав в 2 раза большую длину.


          Re[4]: CreateFileMapping и указание размера файла

          От:

          Pavel Dvorkin

          Россия

           
          Дата:  11.02.10 12:00
          Оценка:

          Здравствуйте, Qa1888, Вы писали:

          Q>Если файл физически на диске, то да — записали, закрыли, спроецировали повторно, подали хендл. А если открывали для обмена данными между процессами и первый параметр INVALID_HANDLE_VALUE, то как вы повторно откроете?

          А тогда иначе надо делать.

          SEC_RESERVE
          If the file mapping object is backed by the operating system paging file (the hfile parameter is INVALID_HANDLE_VALUE), specifies that when a view of the file is mapped into a process address space, the entire range of pages is reserved for later use by the process rather than committed.

          Reserved pages can be committed in subsequent calls to the VirtualAlloc function. After the pages are committed, they cannot be freed or decommitted with the VirtualFree function.

          То есть хотя и мэппинг, но резервирование пространства как у MEM_RESERVE только. Можно заведомо большой кусок зарезервировать.А потом понемногу коммитировать.

          Впрочем, вместо этого можно просто VirtualAlloc. Единственное, что здесь дает мэппинг — расшаривание между процессами.

          With best regards
          Pavel Dvorkin


          Re: CreateFileMapping и указание размера файла

          От:

          ononim

           
          Дата:  11.02.10 12:14
          Оценка:

          Начинать с файла размером 4кб. Когда нужно его вырастить — увеличить размер файла, и пересоздать на него новый маппинг.
          Уменьшать размер файла меньше дальней границы открытых на него маппингов понятное дело низзя.
          Кстати.. эээ… есть такая функция NtExtendSection.. эээ.. но лучше замнем эту тему

          Как много веселых ребят, и все делают велосипед…


          Re[2]: CreateFileMapping и указание размера файла

          От: Аноним

           
          Дата:  11.02.10 13:48
          Оценка:

          Здравствуйте, ononim, Вы писали:

          O>Начинать с файла размером 4кб. Когда нужно его вырастить — увеличить размер файла, и пересоздать на него новый маппинг.

          O>Уменьшать размер файла меньше дальней границы открытых на него маппингов понятное дело низзя.
          O>Кстати.. эээ… есть такая функция NtExtendSection.. эээ.. но лучше замнем эту тему

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

          Например есть у меня XML данные размером ~1000 байт я создаю мэппинг предварительно на 4кб, на диске появляется файл с мусором , потом я в него пишу эти 1000 байт и получается остальные 3 кб с мусором, забивать их нулями тоже как-то бредово.

          <xml>
          …..
          </xml>
          БББББББББББББББББРРРРРРРРРРРПППППППППППППП
          БББББББББББББББББРРРРРРРРРРРПППППППППППППП
          БББББББББББББББББРРРРРРРРРРРПППППППППППППП
          ..
          БББББББББББББББББРРРРРРРРРРРПППППППППППППП


          Re[3]: CreateFileMapping и указание размера файла

          От:

          ononim

           
          Дата:  11.02.10 13:52
          Оценка:

          +2

          А>Может я зря вообще с маппингом связался, у меня задача создать файл и потихоньку в него сливать данные или аппендить к существующему.
          зря

          Как много веселых ребят, и все делают велосипед…


          Re[5]: CreateFileMapping и указание размера файла

          От: Аноним

           
          Дата:  11.02.10 14:20
          Оценка:

          PD>А тогда иначе надо делать.

          PD>SEC_RESERVE

          PD> If the file mapping object is backed by the operating system paging file (the hfile parameter is INVALID_HANDLE_VALUE), specifies that when a view of the file is mapped into a process address space, the entire range of pages is reserved for later use by the process rather than committed.

          PD>Reserved pages can be committed in subsequent calls to the VirtualAlloc function. After the pages are committed, they cannot be freed or decommitted with the VirtualFree function.


          PD>То есть хотя и мэппинг, но резервирование пространства как у MEM_RESERVE только. Можно заведомо большой кусок зарезервировать.А потом понемногу коммитировать.

          Решил попробовать создавать для каждой части новый мэппинг, вот тестовый пример
          вылезает ошибка Базовый адрес или смещение имеют неверное выравнивание при повторном мэппинге

          
          char part1[4] = { 0x01, 0x02, 0x03, 0x04 };  // допустим это первая порция данных в 4 байта
          char part2[4] = { 0x05, 0x06, 0x07, 0x08 };  // а это вторая порция
          
          //нам нужно сначала сохранить первую порцию в файл, а потом дописать вторую
          
          HANDLE h_file = CreateFile  (
                            L"C:tmptest.dat",
                            GENERIC_WRITE | GENERIC_READ ,
                            FILE_SHARE_READ ,
                            NULL,
                            CREATE_NEW,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL
                          );
          
          
          
          HANDLE h_map_r = CreateFileMapping  ( h_file, NULL, PAGE_READWRITE | SEC_RESERVE, 0, 4, NULL );// резервируем 4 байта
          void*  p_map_r = MapViewOfFile      ( h_map_r, FILE_MAP_READ | FILE_MAP_WRITE,  0,  0, 4 );    // начинаем с 0й позиции и резервируем 4 байта для записи  
          memcpy( p_map_r, part1, 4 );
          UnmapViewOfFile( p_map_r );
          CloseHandle(h_map_r);
          
          
          
          HANDLE h_map_r = CreateFileMapping  ( h_file, NULL, PAGE_READWRITE | SEC_RESERVE, 0, 4 + 4, NULL ); // резервируем 8 байт ( размер 1 части +2й части )
          // Тут все успешно, GetLastError() == 0 и h_map_r != 0
          
          void*  p_map_r = MapViewOfFile      ( h_map_r, FILE_MAP_READ | FILE_MAP_WRITE,  0,  4, 4 );         // создаем указатель со смещением на 4й- байт и резервируем 4 байта для записи  
          
          ////////////////////////
          // вот тут на MapViewOfFile получаем ошибку "Базовый адрес или смещение имеют неверное выравнивание."
          ////////////////////////
          
          
          memcpy( p_map_r, part2, 4 );
          UnmapViewOfFile( p_map_r );
          CloseHandle(h_map_r);
          
          CloseHandle(h_file);


          Re[6]: CreateFileMapping и указание размера файла

          От:

          ononim

           
          Дата:  11.02.10 15:37
          Оценка:

          добавь в начале этого кода коммент :
          //this code does same thing as WriteFile
          чтобы будущие программеры не сильно злились.. карму беречь надо.

          Как много веселых ребят, и все делают велосипед…


          Re[7]: CreateFileMapping и указание размера файла

          От: Аноним

           
          Дата:  11.02.10 17:08
          Оценка:

          Здравствуйте, ononim, Вы писали:

          O>добавь в начале этого кода коммент :

          O>//this code does same thing as WriteFile
          O>чтобы будущие программеры не сильно злились.. карму беречь надо.
          Да, спасибо ! Я уже сделал с WriteFile, но хочу просто с маппингом разобраться, понять что не так


          Re[6]: CreateFileMapping и указание размера файла

          От:

          Jolly Roger

           
          Дата:  12.02.10 03:22
          Оценка:

          Здравствуйте, Аноним, Вы писали:

          А>void* p_map_r = MapViewOfFile ( h_map_r, FILE_MAP_READ | FILE_MAP_WRITE, 0, 4, 4 ); // создаем указатель со смещением на 4й- байт и резервируем 4 байта для записи


          А>////////////////////////

          А>// вот тут на MapViewOfFile получаем ошибку «Базовый адрес или смещение имеют неверное выравнивание.»
          А>////////////////////////

          MSDN:

          dwFileOffsetLow

          [in] Specifies the low-order DWORD of the file offset where mapping is to begin. The combination of the high and low offsets

          must specify an offset within the file that matches the system’s memory allocation granularity, or the function fails.

          That is, the offset must be a multiple of the allocation granularity. Use the GetSystemInfo function, which fills in the members of a SYSTEM_INFO structure, to obtain the system’s memory allocation granularity.

          http://files.rsdn.org/82987/Img.GIF «Нормальные герои всегда идут в обход!»

          Подождите ...

          Wait...

          • Переместить
          • Удалить
          • Выделить ветку

          Пока на собственное сообщение не было ответов, его можно удалить.

          
          BOOL CMMFile::Open(char *filename, DWORD Type, DWORD szFile)
          {
          	HANDLE hFile;						//Handle to the file
          	DWORD OpenAs[5];					//Used to define what type of reading to do.
          	
          	if(Type == READ)
          	{
          		OpenAs[0] = GENERIC_READ;
          		OpenAs[1] = FILE_SHARE_READ;
          		OpenAs[2] = OPEN_EXISTING;
          		OpenAs[3] = PAGE_READONLY;
          		OpenAs[4] = FILE_MAP_READ;
          	}
          	if(Type == WRITE)
          	{
          		OpenAs[0] = GENERIC_WRITE;
          		OpenAs[1] = FILE_SHARE_WRITE;
          		OpenAs[2] = OPEN_ALWAYS;
          		OpenAs[3] = PAGE_READWRITE;
          		OpenAs[4] = FILE_MAP_WRITE;
          	}
              	
          	hFile = CreateFile(filename,		//Use the filename passed to the function
          					OpenAs[0],			//Open file w/ OpenAs[0] attrib
          					OpenAs[1],			//Share file rights.  I.E. OpenAs[1]
          					NULL,				//PSA Attribute
          					OpenAs[2],			//Open only w/ OpenAs[2] Attrib.
          					FILE_ATTRIBUTE_NORMAL,
          					NULL);
          	
          	if(hFile == INVALID_HANDLE_VALUE)
          	{
          		MessageBox(NULL, "Failed to open file.", filename, MB_OK | MB_ICONSTOP);
          		return FALSE;
          	}
              
          	if(Type == READ)
                  FileSize = GetFileSize(hFile, NULL);
          	if(Type == WRITE)
          		FileSize = szFile;
          
              HANDLE hFileMap = CreateFileMapping(hFile, NULL, OpenAs[3], 0, FileSize, NULL);
          	CloseHandle(hFile);
          	DWORD x = GetLastError();
          
          	if(hFileMap == NULL)
          	{
          		MessageBox(NULL, "Failed to create file map.", filename, MB_OK | MB_ICONSTOP);
          		return FALSE;
          	}
          
          	FilePtr = MapViewOfFile(hFileMap, OpenAs[4], 0, 0, 0);
          	CloseHandle(hFileMap);
          
          	return TRUE;
          }
          
          
          

          Well when I step through it… x is 1006. MSDN says….

          1006 The volume for a file has been externally altered so that the opened file is no longer valid. ERROR_FILE_INVALID

          Please…. any help…..

          [Edited by — Ace826 on November 5, 2004 1:52:41 AM]

          So, can a mod move this to general programming for me?

          [Edited by — Ace826 on November 5, 2004 1:46:03 AM]

          Problem solved.

          Problem was when I tried to open a file that didn’t have any content in it…. an empty file?

          By adding a letter etc to the file, it works.

          Я хотел бы создать файл произвольного размера, используя Windows C/C++ API. Я использую пакет обновления 2 для Windows XP с 32-битным пространством виртуальной адресной памяти. Я знаком с CreateFile.

          Однако CreateFile не имеет аргумента размера. Причина, по которой я хочу передать аргумент размера, заключается в том, чтобы позволить мне создавать файлы отображения памяти, которые позволяют пользователю получать доступ к структурам данных заранее определенного размера. Не могли бы вы посоветовать правильную функцию Windows C/C++ API, которая позволяет мне создать файл произвольного заданного размера? Спасибо

          5 ответы

          Чтобы сделать это в UNIX, найдите (RequiredFileSize — 1) и затем запишите байт. Значение байта может быть любым, но очевидным выбором является ноль.

          Создан 20 янв.

          Ты CreateFile по-прежнему, SetFilePointerEx до нужного размера, а затем звоните SetEndOfFile.

          Создан 20 янв.

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

          Если hFile имеет значение INVALID_HANDLE_VALUE, вызывающий процесс также должен указать размер объекта отображения файла в параметрах dwMaximumSizeHigh и dwMaximumSizeLow. В этом сценарии CreateFileMapping создает объект сопоставления файлов указанного размера, который поддерживается системным файлом подкачки, а не файлом в файловой системе.

          Вы по-прежнему можете поделиться объектом сопоставления с помощью DuplicateHandle.

          Создан 20 янв.

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

          Создан 20 янв.

          чтобы сделать это в Linux, вы можете сделать следующее:

          /**
           *  Clear the umask permissions so we 
           *  have full control of the file creation (see man umask on Linux)
           */
          mode_t origMask = umask(0);
          
          int fd = open("/tmp/file_name",
                O_RDWR, 00666);
          
          umask(origMask);
          if (fd < 0)
          {
            perror("open fd failed");
            return;
          }
          
          
          if (ftruncate(fd, size) == 0)
          {
             int result = lseek(data->shmmStatsDataFd, size - 1, SEEK_SET);
             if (result == -1)
             {
               perror("lseek fd failed");
               close(fd);
               return ;
             }
          
             /* Something needs to be written at the end of the file to
              * have the file actually have the new size.
              * Just writing an empty string at the current file position will do.
              *newDataSize
              * Note:
              *  - The current position in the file is at the end of the stretched
              *    file due to the call to lseek().
              *  - An empty string is actually a single '' character, so a zero-byte
              *    will be written at the last byte of the file.
              */
             result = data->write(fd, "", 1);
             if (result != 1)
             {
               perror("write fd failed");
               close(fd);
          
               return;
             }
          }
          

          ответ дан 13 авг.

          Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

          c++
          c
          createfile

          or задайте свой вопрос.

          5 ответов

          Чтобы сделать это в UNIX, найдите (RequiredFileSize — 1), а затем напишите байт. Значение байта может быть любым, но нулевой — очевидный выбор.

          brewbuck
          20 янв. 2011, в 21:43

          Поделиться

          Вы CreateFile как обычно, SetFilePointerEx до нужного размера, а затем вызовите SetEndOfFile.

          ybungalobill
          20 янв. 2011, в 21:43

          Поделиться

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

          Если hFile является INVALID_HANDLE_VALUE, вызывающий процесс должен также указать размер для объекта сопоставления файлов в параметрах dwMaximumSizeHigh и dwMaximumSizeLow. В этом случае CreateFileMapping создает объект сопоставления файлов указанного размера, который поддерживается файлом подкачки системы, а не файлом в файловой системе.

          Вы все равно можете совместно использовать объект сопоставления с помощью DuplicateHandle.

          wich
          20 янв. 2011, в 22:14

          Поделиться

          в соответствии с вашими комментариями, вам действительно нужно кросс-платформенное решение, поэтому проверьте библиотеку Boost Interprocess. он обеспечивает межплатформенные средства общей памяти и многое другое

          Andriy Tylychko
          20 янв. 2011, в 22:22

          Поделиться

          чтобы сделать это в Linux, вы можете сделать следующее:

          /**
           *  Clear the umask permissions so we 
           *  have full control of the file creation (see man umask on Linux)
           */
          mode_t origMask = umask(0);
          
          int fd = open("/tmp/file_name",
                O_RDWR, 00666);
          
          umask(origMask);
          if (fd < 0)
          {
            perror("open fd failed");
            return;
          }
          
          
          if (ftruncate(fd, size) == 0)
          {
             int result = lseek(data->shmmStatsDataFd, size - 1, SEEK_SET);
             if (result == -1)
             {
               perror("lseek fd failed");
               close(fd);
               return ;
             }
          
             /* Something needs to be written at the end of the file to
              * have the file actually have the new size.
              * Just writing an empty string at the current file position will do.
              *newDataSize
              * Note:
              *  - The current position in the file is at the end of the stretched
              *    file due to the call to lseek().
              *  - An empty string is actually a single '' character, so a zero-byte
              *    will be written at the last byte of the file.
              */
             result = data->write(fd, "", 1);
             if (result != 1)
             {
               perror("write fd failed");
               close(fd);
          
               return;
             }
          }
          

          Leo
          13 авг. 2015, в 19:37

          Поделиться

          Ещё вопросы

          • 0jQuery разборный div, сворачивание 2-ой div
          • 0Как сделать список HTML прокручиваться вниз на полноэкранной странице?
          • 1Как вы понимаете причину исключения, имеющего stacktrace?
          • 0почему я не могу ввести директиву в мои тесты
          • 0.focus () не работает в этом контексте?
          • 1Как я могу переименовать мои изображения?
          • 1iPhone Safari не пересматривает политику безопасности контента
          • 0Получить JSONArray с помощью StringRequest из Android
          • 0Перегрузка операторов в C ++, мне нужно хранить слова intead одной буквы?
          • 0GROUP_CONCAT () для извлечения многомерного массива
          • 1Слушатель событий Watson-IoT в python
          • 0Как братьев и сестер я могу удалить элементы, которые делают?
          • 1Как сделать всплывающую GUITexture?
          • 0Лучший способ построить многомерный массив (категории; подкатегории; подкатегории и т. Д.)
          • 0Почему эта * простая * KnockoutJS страница не работает?
          • 0значение флажка с условием if с помощью jquery
          • 0Handsontable экономя только 250 строк
          • 0включить или отключить ассоциацию
          • 0Угловая директива множественных входов одной модели
          • 0Где я могу получить glibc?
          • 1Android создать действие, которое плавает над экраном блокировки
          • 0Как отключить кнопку с синхронизированным циклом?
          • 0Имеют ли угловые выражения максимальную длину?
          • 1Как сделать выборку из одного класса на каждой итерации
          • 1Оптимизация кода для поиска писем в надстройке Outlook
          • 1Производительность цикла Javascript
          • 1Случайная матрица: по индексу i, j найти те же значения
          • 1Какой тип я должен объявить для моего объекта, чтобы он принимал разные конструкторы из разных классов
          • 1Вырежьте this.index из массива между компонентами в VueJS
          • 1почему мы можем использовать оператор new до загрузки класса
          • 1Есть ли способ узнать, когда данные вставляются и обновляются в базе данных Firebase?
          • 0Jquery скрипт занимает очень очень много времени
          • 1Получение представления даты в секундах в Java
          • 1Ошибка неверного формата JSON при чтении в .txt файлах
          • 1ResultSetMetaData получает значение по умолчанию для столбца
          • 1Ошибка при сворачивании форм с диаграммами в системный трей,
          • 0Используйте Javascript, чтобы сделать кнопки HTML
          • 1Кто должен поймать исключение, звонящий или вызываемый
          • 0Используйте push_back () для добавления элемента в вектор, размер вектора увеличивается, но не может прочитать значения из вектора
          • 1Как подключиться к серверу времени для получения текущих настроек времени? Также есть ли сервер времени вообще?
          • 1Несколько выходов для одной клавиши для функции редуктора, Hadoop
          • 0MySQL Как динамически выбирать, из какой таблицы получать данные при создании представления
          • 1Как я могу сделать этот Observable более пригодным для повторного использования?
          • 0Как правильно отображать заголовки в расширяемом меню?
          • 0Скрыть все div по умолчанию при загрузке страницы, отображать: ни один не работает
          • 1Отображение обратных чисел при загрузке иврита rss с android…
          • 0Вставка данных с использованием Phalcon и отношений
          • 1Android GPS-провайдер
          • 1Как скрыть элементы в дизайнере?
          • 1Когда совпадают обе половины группы регулярных выражений OR, будет ли определено, какой из них будет выбран?

          1. UTeX

            UTeX

            New Member

            Публикаций:

            0

            Регистрация:
            19 окт 2007
            Сообщения:
            584

            1. FMapObject::FMapObject(LPSTR FileName, DWORD CreationDisposition)
            2.     hCreateFile = CreateFileA(FileName,
            3.                             GENERIC_READ|GENERIC_WRITE,
            4.     hFileMapping = CreateFileMapping(hCreateFile, NULL, PAGE_READWRITE, 0, 0, 0);
            5.     DWORD i = GetLastError(); // 1006 :: ERROR_FILE_INVALID
            6.     lpViewOfFile = MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);

          2. Asterix

            Asterix

            New Member

            Публикаций:

            0

            Регистрация:
            25 фев 2003
            Сообщения:
            3.576

            GetLastError следует вызывать только если CreateFileMapping вернула ошибку


          3. UTeX

            UTeX

            New Member

            Публикаций:

            0

            Регистрация:
            19 окт 2007
            Сообщения:
            584


          4. Asterix

            Asterix

            New Member

            Публикаций:

            0

            Регистрация:
            25 фев 2003
            Сообщения:
            3.576

            я бы делал приблизительно так

            1. BOOL MapFile(MAPPED_FILE_INFO* lpmfi)
            2.     lpmfi->hFile = CreateFile(lpmfi->FileName, lpmfi->dwDesiredAccessForCreateFile,
            3.                               FILE_SHARE_READ, 0, OPEN_EXISTING,
            4.                               FILE_ATTRIBUTE_NORMAL, 0);
            5.     if ( lpmfi->hFile == INVALID_HANDLE_VALUE ) return FALSE;
            6.     lpmfi->hMapFile = CreateFileMapping(lpmfi->hFile, NULL, lpmfi->flProtect, 0, 0, NULL);
            7.         lpmfi->lpMapMemory = MapViewOfFile(lpmfi->hMapFile, lpmfi->dwDesiredAccessForMapViewOfFile, 0, 0, 0);
            8.         if ( lpmfi->lpMapMemory ) return TRUE;
            9.         CloseHandle(lpmfi->hMapFile);
            10.     CloseHandle(lpmfi->hFile);

          5. Asterix

            Asterix

            New Member

            Публикаций:

            0

            Регистрация:
            25 фев 2003
            Сообщения:
            3.576

            ответ на поставленный вопрос:
            В случае если функция не возвращала ошибку значение GetLastError может быть каким угодно


          6. UTeX

            UTeX

            New Member

            Публикаций:

            0

            Регистрация:
            19 окт 2007
            Сообщения:
            584


          7. nester7

            nester7

            New Member

            Публикаций:

            0

            Регистрация:
            5 дек 2003
            Сообщения:
            720
            Адрес:
            Russia

            CREATE_ALWAYS + CreateFileMapping(hCreateFile, NULL, PAGE_READWRITE, 0, 0, 0);?
            Попробуй размер выставить больше нуля.


          8. UTeX

            UTeX

            New Member

            Публикаций:

            0

            Регистрация:
            19 окт 2007
            Сообщения:
            584

          9. UTeX

            Не всегда. Чаще всего last error выставляется только если была ошибка. Соответственно, если ошибки не было, то остаётся прежнее значение.


          10. UTeX

            UTeX

            New Member

            Публикаций:

            0

            Регистрация:
            19 окт 2007
            Сообщения:
            584


          11. Asterix

            Asterix

            New Member

            Публикаций:

            0

            Регистрация:
            25 фев 2003
            Сообщения:
            3.576

            для данной конкретной функции вот что написано

            1. If the function succeeds, the return value is a handle to the file-mapping object.
            2. If the object existed before the function call, the GetLastError function returns
            3. ERROR_ALREADY_EXISTS, and the return value is a valid handle to the existing
            4. file-mapping object (with its current size, not the new specified size. If the mapping object
            5. did not exist, GetLastError returns zero.
            6. If the function fails, the return value is NULL. To get extended error information, call GetLastError.

          WASM

          Понравилась статья? Поделить с друзьями:
        • Craftbukkit error unable to access jarfile craftbukkit jar
        • Craft tweaker как изменить крафт
        • Craft the world crash dump ошибка
        • Crackurl error lol skin
        • Cr steam game mismatch как исправить