Delphi中用於讀寫(I/O)的三種檔案型別 (轉)

worldblog發表於2007-12-02
Delphi中用於讀寫(I/O)的三種檔案型別 (轉)[@more@]

中用於讀寫(I/O)的三種型別

一.舊pascal檔案型別
  用舊檔案變數表示的檔案型別,比如 F:text,F:File. 定義了三類:有型別,無型別,字元型別以及一些Delphi的檔案操作.比如:AssignPrn,Writeln,這些檔案類和檔案控制程式碼不相容

二.Windows檔案控制程式碼(handle)
  面向的Pascal的檔案控制程式碼封裝了Windows檔案控制程式碼型別,檔案操作函式庫則封裝了Windows 函式,比如"Fileread"就是了Windows API 函式"ReadFile",Delphi提供了一個Windows API操作介面如果熟悉Windows API,可以用Windows檔案句進行檔案操作.

三.檔案流(File Streams)
  檔案流是TFileStream類的物件例項,檔案流是高層的檔案操作型別,TFileStream提供了一個控制程式碼屬性.用此屬性可操作Windows檔案控制程式碼型別.

如何選擇檔案型別

  Windows檔案控制程式碼是較底層的檔案操作型別,提供了靈活的同步及非同步檔案讀寫控制,以下提供用Windows檔案控制程式碼型別對檔案同步及非同步操作的虛擬碼描述:
同步操作:
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, NULL) ;
// check for eof
if (bResult &&  nBytesRead == 0, ) {
 // we're at the end of the file
 }

非同步操作:
// set up overlapped structure fields 
gOverLapped.Offset  = 0;
gOverLapped.OffsetHigh = 0;
gOverLapped.hEvent  = NULL;
 
// attempt an asynchronous read operation
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead,
  &gOverlapped) ;
 
// if there was a problem, or the async. operation's still pending ...
if (!bResult)
{
  // deal with the error code
  switch (dwError = GetLastError())

  {
  case ERROR_HANDLE_EOF:
  {
  // we're reached the end of the file
  // during the call to ReadFile
 
  // code to handle that
  }
 
  case ERROR_IO_PENDING:
  {
  // asynchronous i/o is still in progress
 
  // do something else for a while
  GoDoSomethingElse() ;
 
  // check on the results of the asynchronous read
  bResult = GetOverlappedResult(hFile, &gOverlapped,

  &nBytesRead, FALSE) ;
 
  // if there was a problem ...
  if (!bResult)
  {
  // deal with the error code
  switch (dwError = GetLastError())
  {
  case ERROR_HANDLE_EOF:
  {
  // we're reached the end of the file
  asynchronous operation
  }
 
  // deal with other error cases

  }
  }
  } // end case
 
  // deal with other error cases
 
  } // end switch
} // end if
 
雖然Windows檔案控制程式碼提供靈活的檔案控制,但須編寫更多的出錯處理程式碼,如果對
WindowsAPI不熟悉,使用Delphi推薦的舊檔案變數型別.

  Delphi的舊檔案型別使用AssignFile,使檔案變數和物理檔案關聯,透過Delphi定義的
對檔案變數的各種操作,完成檔案的存取和操作.使用方便.以下提供對檔案變數類
型的操作程式碼描述:
var

  F: TextFile;
  S: string;
begin
  if OpenDialog1.Execute then  { Display Open dialog box }
  begin
  AssignFile(F, OpenDialog1.FileName);  { File ed in dialog box }
  Reset(F);
  Readln(F, S);  { Read the first line out of the file }
  Edit1.Text := S;  { Put string in a TEdit control }
  CloseFile(F);
  end;
end;

  檔案流是流(stream classes)的子類,所以使用他的一個優點就是能自動繼承其父類的屬性他能很容易的和其他的流類互操作,比如你如果想把一塊動態塊寫入,可以使用一個TFileStream和一個TMemoryStream來完成.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987425/,如需轉載,請註明出處,否則將追究法律責任。

相關文章