- 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
-
Edited by
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
-
Marked as answer by
-
-
Edited by
WayneAKing
Sunday, April 12, 2020 10:58 PM -
Marked as answer by
MyCatAlex
Sunday, April 12, 2020 11:07 PM
-
Edited by
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);
}
|
|
|
Правила раздела Visual C++ / MFC / WTL (далее Раздела)
Отображение файла в память
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Full Member Рейтинг (т): 9 |
Есть код:
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()); } } При запуске выдается ошибка:
CreateFileMapping() error. Code: 1006 В чем может быть проблема и что это за ошибка 1006? |
Hryak |
|
Нельзя мапить файл нулевого размера — скорее всего, в этом у тебя ошибка. Добавлено 05.04.08, 20:07 |
albom |
|
Senior Member Рейтинг (т): 20 |
Цитата Вован Каширский @ 05.04.08, 19:51 что это за ошибка 1006? ERROR_FILE_INVALID
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
- Следующая тема
[ Script execution time: 0,0275 ] [ 16 queries used ] [ Generated: 9.02.23, 09:28 GMT ]
-
.NET
-
Syntax Specific
-
Visual C++ .NET
You should upgrade or use an alternative browser.
CreateFileMapping failed with error 1006
-
Thread starterMyCatAlex
-
Start dateApr 12, 2020
MyCatAlex
-
#1
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.
«Нормальные герои всегда идут в обход!»
- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.
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, будет ли определено, какой из них будет выбран?
-
UTeX
New Member
- Публикаций:
-
0
- Регистрация:
- 19 окт 2007
- Сообщения:
- 584
-
FMapObject::FMapObject(LPSTR FileName, DWORD CreationDisposition)
-
hCreateFile = CreateFileA(FileName,
-
GENERIC_READ|GENERIC_WRITE,
-
hFileMapping = CreateFileMapping(hCreateFile, NULL, PAGE_READWRITE, 0, 0, 0);
-
DWORD i = GetLastError(); // 1006 :: ERROR_FILE_INVALID
-
lpViewOfFile = MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
-
Asterix
New Member
- Публикаций:
-
0
- Регистрация:
- 25 фев 2003
- Сообщения:
- 3.576
GetLastError следует вызывать только если CreateFileMapping вернула ошибку
-
UTeX
New Member
- Публикаций:
-
0
- Регистрация:
- 19 окт 2007
- Сообщения:
- 584
-
Asterix
New Member
- Публикаций:
-
0
- Регистрация:
- 25 фев 2003
- Сообщения:
- 3.576
я бы делал приблизительно так
-
BOOL MapFile(MAPPED_FILE_INFO* lpmfi)
-
lpmfi->hFile = CreateFile(lpmfi->FileName, lpmfi->dwDesiredAccessForCreateFile,
-
FILE_SHARE_READ, 0, OPEN_EXISTING,
-
FILE_ATTRIBUTE_NORMAL, 0);
-
if ( lpmfi->hFile == INVALID_HANDLE_VALUE ) return FALSE;
-
lpmfi->hMapFile = CreateFileMapping(lpmfi->hFile, NULL, lpmfi->flProtect, 0, 0, NULL);
-
lpmfi->lpMapMemory = MapViewOfFile(lpmfi->hMapFile, lpmfi->dwDesiredAccessForMapViewOfFile, 0, 0, 0);
-
if ( lpmfi->lpMapMemory ) return TRUE;
-
CloseHandle(lpmfi->hMapFile);
-
CloseHandle(lpmfi->hFile);
-
Asterix
New Member
- Публикаций:
-
0
- Регистрация:
- 25 фев 2003
- Сообщения:
- 3.576
ответ на поставленный вопрос:
В случае если функция не возвращала ошибку значение GetLastError может быть каким угодно -
UTeX
New Member
- Публикаций:
-
0
- Регистрация:
- 19 окт 2007
- Сообщения:
- 584
-
nester7
New Member
- Публикаций:
-
0
- Регистрация:
- 5 дек 2003
- Сообщения:
- 720
- Адрес:
- Russia
CREATE_ALWAYS + CreateFileMapping(hCreateFile, NULL, PAGE_READWRITE, 0, 0, 0);?
Попробуй размер выставить больше нуля. -
UTeX
New Member
- Публикаций:
-
0
- Регистрация:
- 19 окт 2007
- Сообщения:
- 584
-
UTeX
Не всегда. Чаще всего last error выставляется только если была ошибка. Соответственно, если ошибки не было, то остаётся прежнее значение.
-
UTeX
New Member
- Публикаций:
-
0
- Регистрация:
- 19 окт 2007
- Сообщения:
- 584
-
Asterix
New Member
- Публикаций:
-
0
- Регистрация:
- 25 фев 2003
- Сообщения:
- 3.576
для данной конкретной функции вот что написано
-
If the function succeeds, the return value is a handle to the file-mapping object.
-
If the object existed before the function call, the GetLastError function returns
-
ERROR_ALREADY_EXISTS, and the return value is a valid handle to the existing
-
file-mapping object (with its current size, not the new specified size. If the mapping object
-
did not exist, GetLastError returns zero.
-
If the function fails, the return value is NULL. To get extended error information, call GetLastError.