Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запись файла если его размер неизвестен 
V
    Опции темы
roko
Дата 7.1.2010, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Как можно записать файл на диск, если его размер заранее неизвестен? Например, длина файла может быть 10 байт, а может 10Гб. Если использовать mapping и в CreateFileMapping передать максимальный размер файла(его можно вычислить), то на диске резервируется вся память для файла. Получается что если максимальный размер файла 10Гб, а на деле файл займет 10 байт, то выходит что если надиске нету свободных 10Гб чтобы зарезервировать место для файла максимального размера, файл размером 10 байт нельзя записать. Думал что можно обойтись разреженными файлами, но они вроде для NTFS. Как быть с FAT32?
PM MAIL   Вверх
bra1ny
Дата 7.1.2010, 23:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 26.12.2008

Репутация: 2
Всего: 3



а частями мапить? 

 smile  ничего не пойму , а что-то мешает по ходу дела дозаписовать в файл?(

Это сообщение отредактировал(а) bra1ny - 7.1.2010, 23:45
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
roko
Дата 7.1.2010, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



bra1ny, вы имеете в виду что в CreateFileMap передавать не максимальный размер файла, а какую-то его часть и если понадобится записать больше, то снова вызвать CreateFileMap, но только указать больший размер?

Точно, можно же WriteFile дописывать. Спасибо.

Это сообщение отредактировал(а) roko - 8.1.2010, 00:00
PM MAIL   Вверх
bra1ny
Дата 7.1.2010, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 26.12.2008

Репутация: 2
Всего: 3



я не много не пойму чего Вы делаете , обьясните "на кошках" =)
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
roko
Дата 8.1.2010, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Например так. Есть файл 10Гб. Мне надо создать второй файл в ктором будут только все символы из первого кроме пробелов. Получается что точный размер второго файла наперед узнать нельзя.
PM MAIL   Вверх
bra1ny
Дата 8.1.2010, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 26.12.2008

Репутация: 2
Всего: 3



вы 10 гигов сразу не промапите  В АП процесса. Будете частями мапить. У Рихтера есть пример  , как с такими большими файлами работать.

Добавлено через 6 минут и 59 секунд
Так что :
1 мапите кусочек 
2 парсите его.
3 записываете что надо
4 анмапите старый кусок 
5 идете в пункт 1.


--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
roko
Дата 8.1.2010, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Вот цитата из Рихтера : Для дозаписи данных в файл выбирайте его размер максимальным, чтобы оста вить пространство «для маневра»
Поэтому если пространство «для маневра» будет большим, а висходном файле будут почти все пробелы то второй файл получется маленький и использовать большое пространство для маневра будет не рационально.

я делаю эти пять пунктов если мне известен точный размер файла. Разве можно применять ети 5 пунктов если размер файла наперед неизвестен?

Это сообщение отредактировал(а) roko - 8.1.2010, 00:39
PM MAIL   Вверх
bra1ny
Дата 8.1.2010, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 26.12.2008

Репутация: 2
Всего: 3



м я вас не пойму , зачем вам знать размер выходного файла. Если вы его будете по кускам составлять?)

Пример из того же Рихтера :

Код

__int64 Count0s(void)
{ 
    // начальные границы представлений всегда начинаются no адресам,
    // кратным гранулярности выделения памяти
    SYSTEM_INFO sinf;
    GetSystemInfo(&sinf); 

    // открываем файл данных
    HANDLE hFile = CreateFile( "С:\\HugeFile.Big ", GENERIC_READ, FILE_SHARE_READ,
        NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); 

 
    HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
    DWORD dwFileSizeHigh; 

    __int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
    qwFileSize += (((__int64) dwFileSizeHigh) << 32); 

    // доступ к описателю объекта файл нам больше не нужен
    CloseHandle(hFile); 

    __int64 qwFileOffset = 0;
    qwNumOf0s = 0; 

    while (qwFileSize > 0) { 
        // определяем, сколько байтов надо спроецировать
        DWORD dwBytesInBlock = sinf.dwAllocationGranularity; 

        if (qwFileSize < sinf.dwAllocationGranularity)
            dwBytesInBlock = (DWORD)qwFileSize; 

        PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_READ,
            (DWORD) (qwFileOffset >> 32), // начальный байт
            (DWORD) (qwFileOffset & 0xFFFFFFFF), // в файле
            dwBytesInBlock); // число проецируемых байтов 

        // подсчитываем количество нулевых байтов в этом блоке
        for (DWORD dwByte = 0; dwByte < dwBytesInBlock; dwByte++) { 
            if (pbFile[dwByte] == 0) 
                qwNumOf0s++; 
        } 

        // прекращаем проецирование представления, чтобы в адресном пространстве
        // не образовалось несколько представлений одного файла 

        UnmapViewOfFile(pbFile); 

        // переходим к следующей группе байтов в файле
        qwFileOffset += dwBytesInBlock;
        qwFileSize -= dwBytesInBlock; 
    } 

    CloseHandle(hFileMapping); 

    return(qwNumOf0s); 
}



Это сообщение отредактировал(а) bra1ny - 8.1.2010, 00:47
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
roko
Дата 8.1.2010, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Дело втом, что в этом примере он читает файл и поэтому передает в CreateFileMapping значения dwMaximumSizeHigh и dwMaximumSizeLow равными нулю и, так как файл уже существует и его  размер  !=0, то система сама определяет размер фала. А если бы надо было создать новый файл или длина файла равнялась бы нулю то передавать нули в CreateFileMapping нельзя так как она вернет NULL.

Это сообщение отредактировал(а) roko - 8.1.2010, 01:01
PM MAIL   Вверх
bra1ny
Дата 8.1.2010, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 26.12.2008

Репутация: 2
Всего: 3



А вам что-то мешает создать второй файл и тупо через WriteFile записывать отпарсенный кусок? И в итоге получить свой второй файл без пробелов?

Это сообщение отредактировал(а) bra1ny - 8.1.2010, 01:05
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
roko
Дата 8.1.2010, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



ничего, после того как вы написали
 
Цитата
ничего не пойму , а что-то мешает по ходу дела дозаписовать в файл?(

я решил делать через WriteFile. Просто думал еще как-то можно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.