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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2011, 16:16   #1
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию Искусственное увеличение размера файла

Сразу перейду к проблеме:
Есть вот такой код:
Код:
function PumpExe ( Value : Int64; FileName : String) : boolean;
var
Temp: TFileStream;
begin
try
   Temp := TFileStream.Create(FileName,fmOpenWrite);
   Temp.Size := Temp.Size + Value;
   Temp.Free;
   Result:=True;
except
   Result:=False;
end;
end;
до безумия глупый, но рабочий. Мне надо сделать так, чтобы можно было искуственно увеличивать размер файла на n-ое значение из Edit1. Проблема не в том, что я не могу это реализовать, а втом, что если я хочу увеличить на 100 и более кб то появляется погрешность. Бывает 5-10 кб, бывает и по 100. А мне надо как можно более точное увеличение. А так же, чтобы файл не заполнялся на просто нулями, а разными буквами (рандомные + заглавные и маленькие.) Вот в чем проблема. Заранее большое спасибо.
iLnes вне форума Ответить с цитированием
Старый 09.12.2011, 16:28   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Погрешность будет только от ошибки программиста или не знания того, сколько байтов в килобайте. Заполнение символами - метоты Seek, Write, WriteBuffer. псевдослучайность - Random
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.12.2011, 16:55   #3
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Погрешность будет только от ошибки программиста или не знания того, сколько байтов в килобайте. Заполнение символами - метоты Seek, Write, WriteBuffer. псевдослучайность - Random
Ну так может поможете, а не просто словами кидаться. Проверьте сами, как работает код. И увидите погрешность.
iLnes вне форума Ответить с цитированием
Старый 09.12.2011, 18:34   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Код:
 Temp.Size := Temp.Size + Value;
Это вам ничего не даст.

в Size это read свойство. В него писать нельзя. Да и смысла не имеет.
Чтобы ФИЗИЧЕСКИ увеличить размер, надо в конец файла запись заданное кол-во нулей.
Человек_Борща вне форума Ответить с цитированием
Старый 09.12.2011, 18:54   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
в Size это read свойство. В него писать нельзя.
и давно это read свойство?
Код:
procedure THandleStream.SetSize(const NewSize: Int64);
begin
  Seek(NewSize, soBeginning);
{$IFDEF MSWINDOWS}
  Win32Check(SetEndOfFile(FHandle));
{$ELSE}
  if ftruncate(FHandle, Position) = -1 then
    raise EStreamError(sStreamSetSize);
{$ENDIF}
end;
Цитата:
Да и смысла не имеет.
имеет, сразу зарезервировать место под данные.

ТС, про погрешность ответили, а про данные цитатка с MSDN:
Цитата:
Сообщение от MSDN
If the file is extended, the contents of the file between the old end of the file and the new end of the file are not defined.
правда обычно он все равно нулями будет(немного безопасности), так что руками тогда.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 09.12.2011 в 19:00.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.12.2011, 13:49   #6
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Как ни крути, исправить эту погрешность не могу.
Вот код весь:
Код:
unit untPumper;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, sSpeedButton, StdCtrls, sEdit, sDialogs, ComCtrls,
  sStatusBar, sComboBox, sLabel;

type
  TfrmPumper = class(TForm)
    FileString: TsEdit;
    PumpSize: TsEdit;
    PumperFile: TsSpeedButton;
    OpenFile: TsSpeedButton;
    StatusBar: TsStatusBar;
    PumpSet: TsComboBox;
    sLabelFX1: TsLabelFX;
    sStickyLabel1: TsStickyLabel;
    sStickyLabel2: TsStickyLabel;
    sLabelFX2: TsLabelFX;
    procedure OpenFileClick(Sender: TObject);
    procedure PumperFileClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmPumper: TfrmPumper;

implementation

{$R *.dfm}

function PumpExe ( Value : Int64; FileName : String) : boolean;
var
Temp: TFileStream;
begin
try
   Temp := TFileStream.Create(FileName,fmOpenWrite);
   Temp.Size := Temp.Size + Value;
   Temp.Free;
   Result:=True;
except
   Result:=False;
end;
end;


procedure TfrmPumper.PumperFileClick(Sender: TObject);
begin
  if PumpSet.ItemIndex = 0 then
  begin
    PumpExe(StrToInt64(PumpSize.Text)*1000,FileString.Text);
  end;

  if PumpSet.ItemIndex = 1 then
  begin
    PumpExe(StrToInt64(PumpSize.Text)*1000000,FileString.Text);
  end;

  if PumpSet.ItemIndex = 2 then
  begin
    PumpExe(StrToInt64(PumpSize.Text)*1000000000,FileString.Text);
  end;

  Sleep(1500);
  StatusBar.Panels[0].Text:= 'Готово :)';
    MessageBox(
    Self.Handle
    , PChar('Файл успешно увеличен!!!')
    , PChar('1111')
    , MB_OK + MB_ICONINFORMATION + MB_APPLMODAL
  );
end;
end.
iLnes вне форума Ответить с цитированием
Старый 29.12.2011, 15:14   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Умножение на 1000 - это похоже попытка килобайты в байты перевести? Умножайте на 1024. Аналогично вместо 1000000 - 1024*1024 и 1000000000 - 1024*1024*1024
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.12.2011, 15:34   #8
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

оффтоп:
http://cs11035.vkontakte.ru/u226973/...x_a669b3ea.jpg
Lime вне форума Ответить с цитированием
Старый 29.12.2011, 21:44   #9
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  mb:Cardinal=1048576;
var
  hf:THandle;
begin
  hf := CreateFileA('d:\file.my', GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  SetFilePointer(hf, 20*mb, nil, 0);//выделение 20 мб места для файла
  SetEndOfFile(hf);
  CloseHandle(hf);
end;
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Искусственное увеличение размера ЕХЕ файла DeDoK Общие вопросы Delphi 12 24.12.2010 17:46
Увеличение размера exe файла TrapQ Общие вопросы Delphi 6 27.11.2010 00:28
Искусственное увеличение пинга toruser Работа с сетью в Delphi 2 16.06.2009 18:37
Увеличение размера поля kayman Общие вопросы Delphi 6 16.10.2007 22:35