длинные файлы

Discussion in 'WASM.BEGINNERS' started by Perre, Apr 23, 2007.

  1. Perre

    Perre New Member

    Blog Posts:
    0
    Всем привет
    Прошу прощение за мусор в темах, но что либо найти поиском не получилось.
    Возникли такие вопросы:

    1.Как прочитать длинный файл (больше 4 гиг.) ?
    С обычными файлам проблем нет.
    Проходит ли тут ReadFile ?или надо что-то другое

    2.И можно ли узнавать размер длинных файлов функцией GetFileSize
    Или для длинных файлов надо что-то другое?
    (всё это на 32х битных процессорах)
     
  2. Perre

    Perre New Member

    Blog Posts:
    0
    Можно ли это сделать с помощью SetFilePointer ?
     
  3. n0name

    n0name New Member

    Blog Posts:
    0
    2. да. Специальный параметр же введен :\
     
  4. Y_Mur

    Y_Mur Active Member

    Blog Posts:
    0
    n0name
    как раз это ни о чём не говорит - в маппинге файлов он тоже введён, а реальный предел всё равно 2Г ;)

    Perre
    такие вещи нужно не искать, а пробовать "методом научного тыка" ;)
     
  5. Perre

    Perre New Member

    Blog Posts:
    0
    :dntknw: неужели из всех кто прочел этот вопрос, некто не работал с длинными файлами
    наверно просто лень писать,
    но за это тоже винить не кого т.к. за ответы на форумах деньги не платят.

    n0name и Y_Mur из того что вы сказали я мало что понял, но всё равно спасибо

    (мсдна у меня пока нету, да и программистам я не работаю, но очень хочу написать один фришный проект, я уже 2й месяц над ним работаю, хочу что-то хорошее написать, хотя знаю: писать что либо для других и бесплатно, это не благодарное дело )
     
  6. asmfan

    asmfan New Member

    Blog Posts:
    0
    Perre
    Порежь свой длинный файл на кусочки и их и обрабатывай.
    /Так и напёрстком вычерпаешь море - было бы время./
    /А без API документации - нулевой резалт. Это намёк./
     
  7. Ultrin Faern

    Ultrin Faern New Member

    Blog Posts:
    0
    Вот по поводу SetFilePointer
    http://msdn2.microsoft.com/en-us/library/aa365541.aspx
    если ссылка открылась, повторите еще раз, что у вас нет MSDN...

    Особо обратите внимание на параметр lpDistanceToMoveHigh

    И там же рядышком все что нужно для чтения\записи ...
     
  8. Perre

    Perre New Member

    Blog Posts:
    0
    Не получится, дело в том что моя программа должна следить за изменениями на дисках, она подсчитывает контрольную сумму каждого файла , записывает её себе также записывает размер и дату.
    Т.е. файлы не мои, и что в них я тоже не знаю .
    asmfan я понимаю , что программистам с длинными файлами приходится работать очень редко.

    Поищу еще пару дней, если не найду , тогда придется писать бес поддержки длинных файлов (мне не хочется потом переделывать)
     
  9. Perre

    Perre New Member

    Blog Posts:
    0
    Ultrin Faern:) мне надо сейчас спать (жена тянет), посмотрю завтра.
     
  10. MSoft

    MSoft New Member

    Blog Posts:
    0
    А как же ты собираешься писать, если у тебя нет описания функций???????? Или ты имел ввиду, шоб за тебя написали? Поддержка больших файлов от небольших отличается одним единственным параметром. Например, в SetFilePointer для маленьких файлов третий параметр равен 0 (обычно), а для больших - это указатель на переменную размером word, в которой хранится старший адрес для сдвига. Короче, ищи если не MSDN, то хотя бы SDK, иначе никак :dntknw:
     
  11. Perre

    Perre New Member

    Blog Posts:
    0
    MSoft – дело в том что у меня с английским тяжело, мне говорили что есть чтото похожее только на русском, вот только не сказали как называется

    А прогу получается писать только благодаря Интернету и исподникам из пакета масм, иногда кто-то из знакомых что либо подскажет

    Когда-то давно я программировал на Спектрумах (тоже на асемблере), но потом появилась 486я у меня, после недели дума я начал вникать в программирование, потом началась работа и гулянки. Ну вобщем я забросил программирование наверно лет на семь
     
  12. MSoft

    MSoft New Member

    Blog Posts:
    0
    Perre
    хм... даже не знаю, что сказать. Я правда с трудом представляю, как ты будешь кодить, не зная англицкого даже на уровне MSDN. Хотя выучить асм - недели вполне достаточно. Что же касается русского варианта справочника, я где-то видел в сети (давно это было) русскую версию SDK. Но она была крайне урезана. Для работы с файлами может и хватит, а вот на что-то большее вряд ли. Вобщем, ищи SDK в переводе.
     
  13. q_q

    q_q New Member

    Blog Posts:
    0
    Y_Mur
    в маппинге файлов он тоже введён, а реальный предел всё равно 2Г
    Означает ли твоя фраза, что используя MapViewOfFileEx нельзя отобразить в память часть файла расположенную после 2Gb?
     
  14. Y_Mur

    Y_Mur Active Member

    Blog Posts:
    0
    Perre
    5+++ :))) Занесу в копилку афоризмов :)))

    q_q
    Это значит, что параметр dwMaximumSizeHigh в CreateFileMapping есть, но он ни черта не работает.
     
  15. q_q

    q_q New Member

    Blog Posts:
    0
    Y_Mur
    Code (Text):
    1. #define WIN32_LEAN_AND_MEAN
    2. #include <windows.h>
    3. void main(void)
    4. {
    5.   HANDLE hf = CreateFile("C:\\MMFTest dat",
    6.                 GENERIC_READ | GENERIC_WRITE,
    7.                 FILE_SHARE_READ | FILE_SHARE_WRITE,
    8.                 NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    9.   if (INVALID_HANDLE_VALUE != hf)
    10.   {
    11.     HANDLE hm = CreateFileMapping(hf, NULL,
    12.                   PAGE_READWRITE, 1, 1024*1024*1024, NULL);
    13.     if (NULL != hm)
    14.       CloseHandle(hm);
    15.     CloseHandle(hf);
    16.   }
    17. }
    создает на диске с NTFS файл размером 5Gb, используя, ни черта не работающий параметр dwMaximumSizeHigh.
     
  16. leo

    leo Active Member

    Blog Posts:
    0
    Perre
    Ну и в чем тогда проблема ? Читаешь файл блоками пока ReadFile возвращает true и dwBytesReaded = dwBytesToRead (или как их там ; ). Дату и размер файла можно получить по GetFileInformationByHandle
     
  17. Perre

    Perre New Member

    Blog Posts:
    0
    leo – я не до конца понял то, что ты написал, проблема в том что файлы могут быть больше 4 гиг. А в один 32х битный регистр помешается 4294967295 байт

    MSoft – спасибо за SDK, а за английский не переживай :) , если что-то нужное я найду способ как перевести (есть электронные переводчики, они хоть и корявые, но смысл понять можно. Еще есть друзья которые мне помогут ), да и exe у меня уже из 4 окон и весит 35 кил.

    Y_Mur и q_q – не могу понять, почему именно 2 гига.? (ведь в регистр 32 бита влезет 4294967295 байт. Или 2147483647,5 со знаком ).

    Может у не которых не получается потому, что файловая система fat32 (она не поддерживает файлы больше 4 гиг)

    Ладно буду пробовать SetFilePointer
     
  18. q_q

    q_q New Member

    Blog Posts:
    0
    Perre
    файлы могут быть больше 4 гиг. А в один 32х битный регистр помешается 4294967295 байт
    Ты хочешь прочитать весь файл сразу?

    leo – я не до конца понял то, что ты написал
    Он предлагает читать кусочками, последовательно, ОС позаботится о перемещении файлового указателя.

    Y_Mur и q_q – не могу понять, почему именно 2 гига.?
    Это вопрос не ко мне.
     
  19. Perre

    Perre New Member

    Blog Posts:
    0
    Весь файл ? а где столько оперативки набраться :)

    Такое чтение мне подойдёт, можете показать пример, буду очень признательный
    (я ещё слабо знаю винду , не знал что так можно, и думал сам перемещать указатель)
     
  20. q_q

    q_q New Member

    Blog Posts:
    0
    Perre
    можете показать пример
    Пожалуйста, и GetFileSize, и ReadFile в цикле последовательно.
    Code (Text):
    1. ...
    2.  
    3. static DWORD WINAPI GetPageSize(void)
    4. {
    5.   SYSTEM_INFO si;
    6.   GetSystemInfo(&si);
    7.   return si.dwPageSize;
    8. }
    9.  
    10. void foo(LPTSTR pszFileName)
    11. {
    12.   HANDLE         hFile     = INVALID_HANDLE_VALUE;
    13.   LPVOID         pBuffer   = NULL;
    14.   DWORD          dwBufSize = GetPageSize();
    15.  
    16.   LARGE_INTEGER  liFileSize;
    17.   DWORD          dwNumberOfBytesToRead, dwNumberOfBytesRead;
    18.  
    19.   hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ,
    20.             NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    21.   if (INVALID_HANDLE_VALUE == hFile)
    22.     goto cleanup;
    23.  
    24.   liFileSize.QuadPart = 0;
    25.   liFileSize.LowPart  = GetFileSize(hFile, (DWORD *)&(liFileSize.HighPart));
    26.   if (INVALID_FILE_SIZE == liFileSize.LowPart)
    27.     goto cleanup;
    28.  
    29.   if (0 == liFileSize.QuadPart)
    30.     goto cleanup; // File is empty
    31.  
    32.   pBuffer = HeapAlloc(GetProcessHeap(), 0, dwBufSize);
    33.   if (NULL == pBuffer)
    34.     goto cleanup;
    35.  
    36.   while (0 != liFileSize.QuadPart)
    37.   {
    38.     dwNumberOfBytesToRead = (DWORD) min((LONGLONG) dwBufSize, liFileSize.QuadPart);
    39.     if (0 == ReadFile(hFile, pBuffer, dwNumberOfBytesToRead, &dwNumberOfBytesRead, NULL))
    40.       goto cleanup;
    41.     if (dwNumberOfBytesToRead != dwNumberOfBytesRead)
    42.       goto cleanup;
    43.     liFileSize.QuadPart -= dwNumberOfBytesRead;
    44.     //
    45.     // в pBuffer очередная порция данных
    46.     //  размер dwNumberOfBytesRead
    47.     //
    48.   }
    49.  
    50. cleanup:
    51.   if (NULL != pBuffer)
    52.     HeapFree(GetProcessHeap(), 0, pBuffer);
    53.   if (INVALID_HANDLE_VALUE != hFile)
    54.     CloseHandle(hFile);
    55. }
    56. ...