Всем привет Прошу прощение за мусор в темах, но что либо найти поиском не получилось. Возникли такие вопросы: 1.Как прочитать длинный файл (больше 4 гиг.) ? С обычными файлам проблем нет. Проходит ли тут ReadFile ?или надо что-то другое 2.И можно ли узнавать размер длинных файлов функцией GetFileSize Или для длинных файлов надо что-то другое? (всё это на 32х битных процессорах)
n0name как раз это ни о чём не говорит - в маппинге файлов он тоже введён, а реальный предел всё равно 2Г Perre такие вещи нужно не искать, а пробовать "методом научного тыка"
неужели из всех кто прочел этот вопрос, некто не работал с длинными файлами наверно просто лень писать, но за это тоже винить не кого т.к. за ответы на форумах деньги не платят. n0name и Y_Mur из того что вы сказали я мало что понял, но всё равно спасибо (мсдна у меня пока нету, да и программистам я не работаю, но очень хочу написать один фришный проект, я уже 2й месяц над ним работаю, хочу что-то хорошее написать, хотя знаю: писать что либо для других и бесплатно, это не благодарное дело )
Perre Порежь свой длинный файл на кусочки и их и обрабатывай. /Так и напёрстком вычерпаешь море - было бы время./ /А без API документации - нулевой резалт. Это намёк./
Вот по поводу SetFilePointer http://msdn2.microsoft.com/en-us/library/aa365541.aspx если ссылка открылась, повторите еще раз, что у вас нет MSDN... Особо обратите внимание на параметр lpDistanceToMoveHigh И там же рядышком все что нужно для чтения\записи ...
Не получится, дело в том что моя программа должна следить за изменениями на дисках, она подсчитывает контрольную сумму каждого файла , записывает её себе также записывает размер и дату. Т.е. файлы не мои, и что в них я тоже не знаю . asmfan я понимаю , что программистам с длинными файлами приходится работать очень редко. Поищу еще пару дней, если не найду , тогда придется писать бес поддержки длинных файлов (мне не хочется потом переделывать)
А как же ты собираешься писать, если у тебя нет описания функций???????? Или ты имел ввиду, шоб за тебя написали? Поддержка больших файлов от небольших отличается одним единственным параметром. Например, в SetFilePointer для маленьких файлов третий параметр равен 0 (обычно), а для больших - это указатель на переменную размером word, в которой хранится старший адрес для сдвига. Короче, ищи если не MSDN, то хотя бы SDK, иначе никак
MSoft – дело в том что у меня с английским тяжело, мне говорили что есть чтото похожее только на русском, вот только не сказали как называется А прогу получается писать только благодаря Интернету и исподникам из пакета масм, иногда кто-то из знакомых что либо подскажет Когда-то давно я программировал на Спектрумах (тоже на асемблере), но потом появилась 486я у меня, после недели дума я начал вникать в программирование, потом началась работа и гулянки. Ну вобщем я забросил программирование наверно лет на семь
Perre хм... даже не знаю, что сказать. Я правда с трудом представляю, как ты будешь кодить, не зная англицкого даже на уровне MSDN. Хотя выучить асм - недели вполне достаточно. Что же касается русского варианта справочника, я где-то видел в сети (давно это было) русскую версию SDK. Но она была крайне урезана. Для работы с файлами может и хватит, а вот на что-то большее вряд ли. Вобщем, ищи SDK в переводе.
Y_Mur в маппинге файлов он тоже введён, а реальный предел всё равно 2Г Означает ли твоя фраза, что используя MapViewOfFileEx нельзя отобразить в память часть файла расположенную после 2Gb?
Perre 5+++ )) Занесу в копилку афоризмов )) q_q Это значит, что параметр dwMaximumSizeHigh в CreateFileMapping есть, но он ни черта не работает.
Y_Mur Code (Text): #define WIN32_LEAN_AND_MEAN #include <windows.h> void main(void) { HANDLE hf = CreateFile("C:\\MMFTest dat", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE != hf) { HANDLE hm = CreateFileMapping(hf, NULL, PAGE_READWRITE, 1, 1024*1024*1024, NULL); if (NULL != hm) CloseHandle(hm); CloseHandle(hf); } } создает на диске с NTFS файл размером 5Gb, используя, ни черта не работающий параметр dwMaximumSizeHigh.
Perre Ну и в чем тогда проблема ? Читаешь файл блоками пока ReadFile возвращает true и dwBytesReaded = dwBytesToRead (или как их там ; ). Дату и размер файла можно получить по GetFileInformationByHandle
leo – я не до конца понял то, что ты написал, проблема в том что файлы могут быть больше 4 гиг. А в один 32х битный регистр помешается 4294967295 байт MSoft – спасибо за SDK, а за английский не переживай , если что-то нужное я найду способ как перевести (есть электронные переводчики, они хоть и корявые, но смысл понять можно. Еще есть друзья которые мне помогут ), да и exe у меня уже из 4 окон и весит 35 кил. Y_Mur и q_q – не могу понять, почему именно 2 гига.? (ведь в регистр 32 бита влезет 4294967295 байт. Или 2147483647,5 со знаком ). Может у не которых не получается потому, что файловая система fat32 (она не поддерживает файлы больше 4 гиг) Ладно буду пробовать SetFilePointer
Perre файлы могут быть больше 4 гиг. А в один 32х битный регистр помешается 4294967295 байт Ты хочешь прочитать весь файл сразу? leo – я не до конца понял то, что ты написал Он предлагает читать кусочками, последовательно, ОС позаботится о перемещении файлового указателя. Y_Mur и q_q – не могу понять, почему именно 2 гига.? Это вопрос не ко мне.
Весь файл ? а где столько оперативки набраться Такое чтение мне подойдёт, можете показать пример, буду очень признательный (я ещё слабо знаю винду , не знал что так можно, и думал сам перемещать указатель)
Perre можете показать пример Пожалуйста, и GetFileSize, и ReadFile в цикле последовательно. Code (Text): ... static DWORD WINAPI GetPageSize(void) { SYSTEM_INFO si; GetSystemInfo(&si); return si.dwPageSize; } void foo(LPTSTR pszFileName) { HANDLE hFile = INVALID_HANDLE_VALUE; LPVOID pBuffer = NULL; DWORD dwBufSize = GetPageSize(); LARGE_INTEGER liFileSize; DWORD dwNumberOfBytesToRead, dwNumberOfBytesRead; hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) goto cleanup; liFileSize.QuadPart = 0; liFileSize.LowPart = GetFileSize(hFile, (DWORD *)&(liFileSize.HighPart)); if (INVALID_FILE_SIZE == liFileSize.LowPart) goto cleanup; if (0 == liFileSize.QuadPart) goto cleanup; // File is empty pBuffer = HeapAlloc(GetProcessHeap(), 0, dwBufSize); if (NULL == pBuffer) goto cleanup; while (0 != liFileSize.QuadPart) { dwNumberOfBytesToRead = (DWORD) min((LONGLONG) dwBufSize, liFileSize.QuadPart); if (0 == ReadFile(hFile, pBuffer, dwNumberOfBytesToRead, &dwNumberOfBytesRead, NULL)) goto cleanup; if (dwNumberOfBytesToRead != dwNumberOfBytesRead) goto cleanup; liFileSize.QuadPart -= dwNumberOfBytesRead; // // в pBuffer очередная порция данных // размер dwNumberOfBytesRead // } cleanup: if (NULL != pBuffer) HeapFree(GetProcessHeap(), 0, pBuffer); if (INVALID_HANDLE_VALUE != hFile) CloseHandle(hFile); } ...