4

名前付きのアプリで、mysoft読み取りたいファイルがであるとしますafile.binmysoftプログラムファイルフォルダにあります。mysoftが管理者権限で実行されていないと仮定しましょう。

procedure TForm1.Button1Click(Sender: TObject);
var 
  afile: File of Byte;
begin
  AssignFile(Infile, 'C:\Program Files\mysoft\afile.bin');
  Reset(afile);
  CloseFile(afile);
end;

上記の簡単なコードafile.binは、互換性ファイルフォルダにのコピーを作成します。

私の質問は次のとおりです。

  1. なんで ?私はいまいましいファイルを読むだけで、それを変更したくありません。
  2. 別のフォルダにファイルを移動する以外にこれを防ぐ方法は?

ここでも、データファイルを読み取るだけで、取得できません。

4

3 に答える 3

5

を呼び出すとReset、ファイルが書き込み用に開かれます。これは、のデフォルト値がであるためSystem.FileModeですfmOpenReadWrite。アプリは仮想化されて実行され、ユーザートークンには管理者権限がないため、仮想化レイヤーが起動し、仮想ストアにファイルのコピーを作成します。

従来のPascalI/ Oを使用して利用できるソリューションは、に設定FileModeすることfmOpenReadです。次にReset、読み取り用にファイルを開き、仮想化レイヤーは呼び出されません。

FileModeこれは、すべてのレガシーPascal I/Oに影響を与えるグローバル変数であることを忘れないでください。スレッドがある場合、またはファイルを書き込む必要があるときにFileMode戻るのを忘れた場合は、悲惨なことになります。fmOpenReadWrite反抗しませんか?ワイドグローバルフラグを処理してファイルアクセスモードを制御します!まあ、このようなものは、アプリケーションにスレッドができるずっと前に発明されました。そして、OOPが発明されるずっと前に。だから私はそれがなぜそうなのか理解できます。

これから学ぶべき教訓は、ファイルアクセスの最新の形式の1つに切り替える時が来たということです。たとえば、TFileStream

実際、アプリケーションで仮想化を無効にする時期でもあります。仮想化は、ほぼ6年前にVistaで導入されました。これは、Vista用にまだ再コンパイルされていない古いプログラムのヘルプとして意図されていました。アプリケーションはまだそれを使用してはいけません。

于 2012-10-10T16:25:23.877 に答える
2

TStreamReaderクラスをサポートするバージョンのDelphiがあり、ファイルがテキストの場合は、次のコードを使用できます。

procedure TForm1.btn1Click(Sender: TObject);
var
  SR : TStreamReader;
  line : string;
begin
  SR := TStreamReader.Create('C:\Program Files\mysoft\afile.bin');
  try
  while not SR.EndOfStream do
  begin
    line := SR.ReadLine;
  end;
  finally
  SR.Free;
  end;
end;

そうでない場合は、任意のファイルで機能するより古典的なアプローチを提案します。

procedure TForm1.btn2Click(Sender: TObject);
var
  FS : TFileStream;
  mem : array of byte;
begin
  FS := TFileStream.Create('C:\Program Files\mysoft\afile.bin',fmOpenRead or fmShareDenyNone);
  try
  SetLength(mem,FS.Size);
  FS.Read(mem[0],FS.Size);
  finally
  FS.Free;
  end;
end;
于 2012-10-10T16:31:11.787 に答える
0

これは、Windows 7の「新機能」がファイルシステム領域(%programfiles%、%systemroot%、%systemdrive%、または%programdata%)のファイルに直接アクセスできないためだと思います。

を使用してファイルを開くようにコードを変更しTFileStream、モードをに設定してみてくださいfmOpenRead

私はそれがうまくいくことを願っています。私はそれを試すために7を持っていません:)

于 2012-10-10T16:29:02.550 に答える