テキストファイルかバイナリーファイルか判別するには

解決


鈴木  2009-08-22 00:56:07  No: 35476

よろしくお願いします。
WindowsXP Delphi6 Personalです。

あるサイトで下記のような簡易暗号化ができるというコードを見つけて
aaaa.txt  というテキストファイルを暗号化して
同じ名前のaaaa.txtで今まで何個も保存しました。(.datとでもして分けておけば良かったのですが)
このファイルを読み込んで、テキストファイルはそのまま、
そうでないときは複合化しなくてはなりません。
テキストの書き込みはDelphiで普通にWriteln(F,NewString);で書き込んだものです。
このテキストファイルかそうでないかを判別する旨い方法を教えてもらえませんか。
よろしくお願いします。

const
   SEED = $12;
//Stringlistで渡せば暗号化してパスに落としてくれる
procedure TForm1.Angoka(var StringList:TStringList;Path:string);
var
    fs: TFileStream;
    i, Len: Integer;
    buf: PChar;
begin
    Len := Length(StringList.Text);
    GetMem(buf, Len+1);
    fs := TFileStream.Create(Path, fmCreate);

    try
        StrPCopy(buf,StringList.Text);
        for i:=0 to Len-1 do
        begin
            Byte(buf[i]) := Byte(buf[i]) xor SEED;
        end;
        fs.Write(buf^, Len);
    finally
        FreeMem(buf);
        fs.Free;
    end;
end;


manbon  2009-08-22 01:50:51  No: 35477

私はいつも、下のどこかで入手したコードを使用しています。
最初の300バイトを調べるようです。

function f_boTextOrBinFileCheck(saFileName: AnsiString): Boolean;
{
saFileName: 調べるファイル名
}
var
  F: File;
  Buf: array[0..300] of Char;
  i,j: integer;
begin
  Result := True;

  if FileExists(saFileName) then begin
    AssignFile(F, saFileName);
    try
      Reset(F, 1);
      try
        BlockRead(F, Buf, 300, i);
        j := i;
        for i := 0 to j - 1 do begin
          if (
              ((Buf[i]>=#$00) and (Buf[i]<=#$08)) or
              //$09:TAB
              //$0A:LF
              ((Buf[i]>=#$0B) and (Buf[i]<=#$0C)) or
              //$0D:CR
              ((Buf[i]>=#$0E) and (Buf[i]<=#$1F))
             )then begin
                Result := False;
                Break;
          end;
        end;
      finally
        CloseFile(F);
      end;
    except
      IOResult;
      Result := False;
    end;
  end;
end;


鈴木  2009-08-22 02:48:07  No: 35478

manbonさん、早速教えて頂き有り難うございました。
コードをそのまま使わせて頂き、旨く解決できました。
実はずっと悩んでいたのです。
結構難しいことが解り質問させて頂きました。
有り難うございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加