Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2009, 08:37   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
Вопрос Как резервировать место при создании файла?

Задача такая: как при создании файла, зная его конечный размер, зарезервировать место на винте? (подобно тому, как это делает довнлоад мастер или юТоррент). Заранее спасибо.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 27.09.2009, 09:48   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Забить его нулями?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   f:file; 
   buf:pointer;
begin
   assignfile(f,'C:\1.myfile');
   rewrite(f);
   while filesize(f)<1024*8 do//1мб
   begin
      buf:=nil;
      blockwrite(F,buf,1);
   end;
   closefile(f);
end;
pushl $0x18E3DF6B
call ICQ

Последний раз редактировалось russian-stalker; 27.09.2009 в 09:50.
russian-stalker вне форума Ответить с цитированием
Старый 27.09.2009, 11:22   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

russian-stalker, пока файл размером, скажем, 1 гб, забьется нулями, да еще и побайтно, проц будет умолять меня дать ему веревку с мылом
И 1024*8 не равно 1 мб
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 27.09.2009, 11:38   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
И 1024*8 не равно 1 мб
Смотря в чем измерять. Если в битах, то правильно, если в байтах, то нет.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 27.09.2009, 11:40   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да, нужно просто создать файл нужного размера.
чем он заполнен - это проблемы ОС.
попробуйте такой код:
Код:
var f : file;
  b1 : byte;
begin
  AssignFile(f,'big1');
  Rewrite(f,1);
  Seek(f,НУЖНЫЙРАЗМЕР_В_БАЙТАХ-1);
  b1 := 0;
  BlockWrite(f, b1, 1);
  CloseFile(f);
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.09.2009, 11:42   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а через что делаем?
у FileStream можно установить св-во Size
и еще можно посмотреть как поток это реализует.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.09.2009, 11:47   #7
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

FileSize как помню в битах измеряется. 1 гб заполняется за 30сек.

Upd:
Пепел Феникса +1, спс, буду знать и правда работает
Код:
var
s:tfilestream;
begin
s:=tfilestream.Create('c:\123.myfile',fmCreate or fmOpenWrite);
s.Size:=1024*1024*1024;//1гб
s.Free;
end;
pushl $0x18E3DF6B
call ICQ

Последний раз редактировалось russian-stalker; 27.09.2009 в 11:56.
russian-stalker вне форума Ответить с цитированием
Старый 27.09.2009, 13:28   #8
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Serge_Bliznykov:
Ваш код работает, но при попытке посмотреть свойства созданного файла проводник вешается! ОС тем самым подчеркивает, что это не ее проблемы
Пепел Феникса:
Хотелось бы реализовать через CreateFile()
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 27.09.2009, 13:39   #9
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Можно распределить место, не забивая нулями, если получить привилегию SeManageVolumePrivilege. Но возможны проблемы с безопасностью:
SetFileValidData
Код:
var
  hf, ht: THandle;
  tp: TOKEN_PRIVILEGES;
begin
  OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, ht);
  LookupPrivilegeValue(nil, 'SeManageVolumePrivilege', tp.Privileges[0].Luid);
  tp.PrivilegeCount := 1;
  tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(ht, false, tp, 0, nil, PCardinal(nil)^);
  CloseHandle(ht);
  hf := CreateFile('d:\file.my', GENERIC_WRITE, 0, nil, CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL, 0);
  SetFilePointer(hf, size, nil, FILE_BEGIN);
  SetEndOfFile(hf);
  SetFileValidData(hf, size);
  CloseHandle(hf);
end;
µTorrent по умолчанию так не делает, но может, если надо - в настройках diskio.no_zero.

Последний раз редактировалось Somebody; 27.09.2009 в 13:42.
Somebody вне форума Ответить с цитированием
Старый 27.09.2009, 14:05   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Ваш код работает, но при попытке посмотреть свойства созданного файла проводник вешается! ОС тем самым подчеркивает, что это не ее проблемы
очень-очень СТРАННО!
только что проверил. всё открывается без проблем.
А Вы закрывать файл не забываете!?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диалоговое окно при создании файла tae1980 Microsoft Office Excel 5 16.03.2009 21:41
События при создании/открытия файла _symon Win Api 2 13.02.2009 21:19
При расположении Label на компонентах, место под Label, не реагирует на событие onClick. NavigatorNeba Компоненты Delphi 3 15.11.2008 19:56
Как и с чего начать при создании 2д игрушки. fis Gamedev - cоздание игр: Unity, OpenGL, DirectX 17 14.05.2007 18:14