掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
テキストの一番上に追加するセオリーは? (ID:31189)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
こんな感じでどうでしょう。 少し長いです。冗長かも。 大きいファイルを扱う場合や、メモリ使用量が気になる場合には効果があるかと思います。 (** * ファイルの先頭に行を追記する。 * FileName: String 対象ファイルの名前 * Line: String 追記する文字列。最後の改行はこの関数で必ず付ける * IsBackup: Boolean バックアップしたファイルを消すならfalse *) function FileSave(const FileName, Line: String; IsBackup: Boolean): Boolean; var isExistFile: Boolean; BackupFileName: String; hReadFile: Cardinal; hWriteFile: Cardinal; Buf: String; Len: Cardinal; begin Result := False; BackupFileName := ChangeFileExt(FileName, '.BAK'); isExistFile := FileExists(FileName); if FileExists(BackupFileName) then begin if DeleteFile(BackupFileName) = false then begin Exit; end; end; hReadFile := INVALID_HANDLE_VALUE; if isExistFile then begin //元のファイルを*.BAKに変更 if RenameFile(FileName, BackupFileName) = false then begin Exit; end; //バックアップしたファイルを開く hReadFile := CreateFile(PCHAR(BackupFileName), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if hReadFile = INVALID_HANDLE_VALUE then begin if isExistFile then begin RenameFile(BackupFileName, FileName); end; Exit; end; end; //ファイルを開く hWriteFile := CreateFile(PCHAR(FileName), GENERIC_WRITE, 0, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0); if hWriteFile = INVALID_HANDLE_VALUE then begin CloseHandle(hReadFile); if isExistFile then begin RenameFile(BackupFileName, FileName); end; Exit; end; //追記分 Buf := Line + #13#10; WriteFile(hWriteFile, PCHAR(Buf)^, Length(Buf), Len, nil); //残りをコピー SetLength(Buf, 1025); if hReadFile <> INVALID_HANDLE_VALUE then begin while True do begin ReadFile(hReadFile, PCHAR(Buf)^, 1024, Len, nil); if Len = 0 Then Break; WriteFile(hWriteFile, PCHAR(Buf)^, Len, Len, nil); end; CloseHandle(hReadFile); end; //閉じる CloseHandle(hWriteFile); //バックアップがいらないなら消す if Not IsBackup then begin DeleteFile(BackupFileName); end; Result := True; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.