我想建立一个文件,指定文件的大小然后再写入数据。就像网络蚂蚁那样,生成的下载文件一开始就占用了需要的磁盘空间。

解决方案 »

  1.   

    filewrite不行吗?
    procedure TForm1.Button1Click(Sender: TObject);
    var
      BackupName: string;
      FileHandle: Integer;
      StringLen: Integer;
      X: Integer;
      Y: Integer;
    begin
      if SaveDialog1.Execute then
      begin
        if FileExists(SaveDialog1.FileName) then
        begin
          BackupName := ExtractFileName(SaveDialog1.FileName);
          BackupName := ChangeFileExt(BackupName, '.BAK');
          if not RenameFile(SaveDialog1.FileName, BackupName) then        raise Exception.Create('Unable to create backup file.');
        end;
        FileHandle := FileCreate(SaveDialog1.FileName);
        { Write out the number of rows and columns in the grid. }
        FileWrite(FileHandle, 
          StringGrid1.ColCount, SizeOf(StringGrid1.ColCount));
        FileWrite(FileHandle, 
          StringGrid1.RowCount, SizeOf(StringGrid1.RowCount));
        for X := 0 to StringGrid1.ColCount ?1 do
        begin      for Y := 0 to StringGrid1.RowCount ?1 do
          begin
            { Write out the length of each string, followed by the string itself. }
            StringLen := Length(StringGrid1.Cells[X,Y]);
            FileWrite(FileHandle, StringLen, SizeOf(StringLen));
            FileWrite(FileHandle,
              StringGrid1.Cells[X,Y], Length(StringGrid1.Cells[X,Y]);
          end;
        end;
        FileClose(FileHandle);
      end;end;
      

  2.   

    BOOL WriteFile(    HANDLE hFile, // handle to file to write to 
        LPCVOID lpBuffer, // pointer to data to write to file 
        DWORD nNumberOfBytesToWrite, // number of bytes to write 
        LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written 
        LPOVERLAPPED lpOverlapped  // pointer to structure needed for overlapped I/O
       );
      

  3.   

    //以下将 temp 分成三个文件 temp1,temp2,temp3
    //长度分别为                 10    5    剩下的
    procedure TForm1.Button2Click(Sender: TObject);
    var
      f:TFileStream;
      m:TMemoryStream;
    begin
      f:=TFileStream.Create('d:\temp',fmOpenReadWrite );
    //  showmessage(inttostr(f.size));
      f.position:=0;  m:=TMemoryStream.create;
      m.CopyFrom(f,10);
      m.SaveToFile('d:\temp1');  m.size:=0;
      m.CopyFrom(f,5);
      m.SaveToFile('d:\temp2');  m.size:=0;
      m.CopyFrom(f,f.size-15);
      m.SaveToFile('d:\temp3');  m.free;
      f.free;end;
      

  4.   

    unit mgr;interfaceuses
      Windows, Messages, SysUtils, Classes, Forms,
      StdCtrls,shlobj, Controls, Dialogs,shellapi;type
      TForm1 = class(TForm)
        GroupBox1: TGroupBox;
        Button1: TButton;
        OpenDialog1: TOpenDialog;
        SaveDialog1: TSaveDialog;
        Button3: TButton;
        GroupBox2: TGroupBox;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
        procedure ListBox1DblClick(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        fstream1:tfilestream;
        fstream2:tfilestream;
        list:tstrings;
        len:tstrings;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}
    const
      flen=136192;  //请注意修改这儿的长度type
      FILE_INFO=record
        filename:array[0..MAX_PATH] of char;
        len:integer;
      end;function SelectDirectory(handle:hwnd;const Caption: string; const Root: WideString;out Directory: string): Boolean;
    var
      lpbi:_browseinfo;
      buf:array [0..MAX_PATH] of char;
      id:ishellfolder;
      eaten,att:cardinal;
      rt:pitemidlist;
      initdir:pwidechar;
    begin
      result:=false;
      lpbi.hwndOwner:=handle;
      lpbi.lpfn:=nil;
      lpbi.lpszTitle:=pchar(caption);
      lpbi.ulFlags:=BIF_RETURNONLYFSDIRS+BIF_EDITBOX;
      SHGetDesktopFolder(id);
      initdir:=pwchar(root);
      id.ParseDisplayName(0,nil,initdir,eaten,rt,att);
      lpbi.pidlRoot:=rt;
      getmem(lpbi.pszDisplayName,MAX_PATH);
      try
       result:=shgetpathfromidlist(shbrowseforfolder(lpbi),buf);
      except
       freemem(lpbi.pszDisplayName);
      end;
      if result then
      begin
       directory:=buf;
       if length(directory)<>3 then directory:=directory+'\';
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      info:FILE_INFO;
      i:integer;
      buf:array[0..4096] of byte;
      s:integer;
    begin
      if savedialog1.Execute then
      if opendialog1.Execute then
      begin
        try
          copyfile(pchar(paramstr(0)),pchar(savedialog1.FileName),false);
          fstream1:=tfilestream.Create(pchar(savedialog1.FileName),fmopenreadwrite);
          fstream1.Seek(flen,soFromBeginning);
          for i:=0 to opendialog1.Files.Count-1 do
          begin
            strpcopy(info.filename,extractfilename(opendialog1.files.strings[i]));
            fstream2:=tfilestream.Create(opendialog1.Files.Strings[i],fmopenread);
            info.len:=fstream2.Size;
            fstream1.Write(info,sizeof(info));
            while fstream2.Position<>fstream2.Size do
            begin
            s:=fstream2.Read(buf,sizeof(buf));
            fstream1.Write(buf,s);
            end;
            fstream2.Free;
          end;
        finally
          fstream1.Free;
        end;
      end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
      f:textfile;
      info:FILE_INFO;
      i:integer;
      buf:array[0..4096] of byte;
      s:integer;
      count,b:integer;
      dir:string;
    begin
    if selectdirectory(handle,'选择输出文件夹','',dir) then
       try
          fstream1:=tfilestream.Create(paramstr(0),fmShareDenyWrite);
          fstream1.Seek(flen,soFromBeginning);
          while fstream1.Position<>fstream1.Size do
          begin
            fstream1.Read(info,sizeof(info));
            count:=0;
            assignfile(f,dir+info.filename);
            rewrite(f);
            closefile(f);
            fstream2:=tfilestream.Create(dir+info.filename,fmopenwrite);
            fstream2.Size:=0;
            i:=info.len div sizeof(buf);
            for b:=1 to i do
            begin
            s:=fstream1.Read(buf,sizeof(buf));
            fstream2.Write(buf,s);
            inc(count,s);
            end;
            s:=fstream1.Read(buf,info.len-count);
            fstream2.Write(buf,s);
            fstream2.Free;
          end;
        finally
          fstream1.Free;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      info:FILE_INFO;
    begin
       list:=tstringlist.Create;
       len:=tstringlist.Create;
       try
          fstream1:=tfilestream.Create(paramstr(0),fmShareDenyWrite);
          fstream1.Seek(flen,soFromBeginning);
          while fstream1.Position<>fstream1.Size do
          begin
            fstream1.Read(info,sizeof(info));
            list.Add(inttostr(fstream1.position));
            len.Add(inttostr(info.len));
            listbox1.Items.Add(info.filename);
            fstream1.Seek(info.len,soFromCurrent);
          end;
        finally
          fstream1.Free;
      end;
      if listbox1.Items.Count>0 then button3.Enabled:=true else button3.Enabled:=false;
    end;procedure TForm1.SaveDialog1CanClose(Sender: TObject;
      var CanClose: Boolean);
    var
      f:integer;
    begin
      f:=filecreate(savedialog1.FileName);
      if f<=0 then
      begin
        MessageBox(handle,'不能选择输出到该文件!',pchar(application.Title),MB_OK+MB_ICONerror);
        canclose:=false;
      end;
      fileclose(f);
    end;procedure TForm1.ListBox1DblClick(Sender: TObject);
    var
      path:array[0..max_path] of char;
      filename:string;
      f,b,s,count:integer;
      buf:array[0..4096] of char;
    begin
      if button3.Enabled=false then exit;
      gettemppath(Max_path,path);
      filename:=path+listbox1.Items.Strings[listbox1.itemindex];
      fstream1:=tfilestream.Create(paramstr(0),fmShareDenyWrite);
      f:=filecreate(filename);
      fileclose(f);
      count:=0;
      fstream2:=tfilestream.Create(filename,fmopenwrite);
      fstream1.Seek(strtoint(list.Strings[listbox1.ItemIndex]),sofrombeginning);
      f:=strtoint(len.Strings[listbox1.itemindex]) div sizeof(buf);
      for b:=1 to f do
      begin
        s:=fstream1.Read(buf,sizeof(buf));
        fstream2.Write(buf,s);
        inc(count,s);
      end;
      s:=fstream1.Read(buf,strtoint(len.Strings[listbox1.itemindex])-count);
      fstream2.Write(buf,s);
      fstream2.Free;
      shellexecute(handle,'open',pchar(filename),'','',sw_show);
      fstream1.Free;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    var
     i:integer;
     path:array[0..max_path] of char;
     filename:string;
    begin
      list.Free;
      len.Free;
      gettemppath(Max_path,path);
      for i:=0 to listbox1.Items.Count-1 do
      begin
        filename:=path+listbox1.Items.Strings[i];
        deletefile(filename);
      end;
    end;
      

  5.   

    没有作过这样的程序,
    学习Ing
    接分
      

  6.   

    有人把delphi的帮助帖了出来,要知道,这段代码在delphi中根本编译不了。
      

  7.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      F:file of byte;
    begin
      AssignFile(F,'F:\1.txt');
      Reset(F);
      Caption:=IntToStr(FileSize(F));
      CloseFile(F);end;procedure TForm1.Button2Click(Sender: TObject);
    var
      MemStream:TMemoryStream;
      Len:int64;
    begin
      MemStream:=TMemoryStream.Create;
      Len:=1024*1024*100;  //100M的文件
      MemStream.SetSize(Len);
      MemStream.SaveToFile('F:\1.txt');
      MemStream.Free;
    end;
      

  8.   

    还有一个问题,如果能解决我另开个200分帖子给分,有大量的文件要存到硬盘上,过一段时间就要删除一部分。使用一段时间后用windows 的磁盘管理工具查看发现全是红色的碎片,所以我想在生成文件的时候就让文件在物理上是连续的,我想这样就不会出现上述的情况了。大家帮帮忙了。谢谢!
      

  9.   

    好像在哪里见过你的这个问题,给个思路供你参考,既然你的文件都很大,且大小差不多,不如在存储这些文件时把他们都存为固定大小,比如90~100M的都存为100M,然后把硬盘分为一些区,每个区存储特定大小的文件,100M,120M...
      

  10.   

    网络蚂蚁/FlashGet在下载文件的时候,会创建这个文件的镜像,如果文件很大,例如一个光盘镜像文件ISO,有650M,此时程序就像死机一样,估计程序在不停的写磁盘~~~~~~:),那么如何快速地创建这种超大的文件呢?看下面的代码:
    function CreateFileOnDisk(FileName: string; Size: Int64): Boolean;
    {
      在硬盘上面快速创建指定大小的文件
    }
    var
      F: HFILE;
    begin
      Result := not FileExists(FileName);
      if Result then
      begin
        F := FileCreate(FileName, 0);
        SetFilePointer(F, Int64Rec(Size).Lo, @Int64Rec(Size).Hi, FILE_BEGIN);
        SetEndOfFile(F);
        Result := GetLastError = 0;
        FileClose(F);
      end;
    end;