2

C#/.NET を使用して、Windows 7 ホストで追加用にファイルを開きたいです。この目的のために、通常のファイル出力操作を使用したいと考えています。私はそのような解決策を見つけました:

FileStream trace_fd = new FileStream(r"c:\temp\testlog.txt", 
                                     FileMode.Append, 
                                     FileAccess.Write, 
                                     FileShare.ReadWrite)

上記の行のプログラムが稼働している場合でも、トレースファイルを読み取ることができます。次のような適切なコードから、ファイルが別のプロセスによって使用されているという例外はありません。

FileStream good_logreader_fd = new FileStream("c:\temp\testlog.txt", 
                                              FileMode.Read, 
                                              FileAccess.Read,
                                              FileShare.ReadWrite)

次に、次のような行を持つ別のプログラム (バグのあるログ スキャナー) があります。

FileStream bad_logreader_fd = new FileStream("c:\temp\testlog.txt", 
                                             FileMode.Read, 
                                             FileAccess.Read, 
                                             FileShare.None)

このような行は、明らかにログ スキャナーのバグです。私のプログラムが実行されていない場合、バグのあるlogscanerが排他ロックを取得し、プログラムのその後の実行はトレースファイルのfdを取得できません.

私の質問は、そのような恐ろしいシナリオが起こらないようにするにはどうすればよいかということです. たとえば、トレースファイルのファイル許可を設定して、誰かが排他ロックを取得できないようにすることはできますか? はいの場合、どのように?私のプログラムをバグのあるログスキャナーの問題から保護できるものは他にありますか? プログラムの実行間で同じトレース ファイル名を保持する必要があることに注意してください。

4

2 に答える 2

2

ファイルへのアクセスを許可する権限を設定することはできませんが、ファイル共有モードはアクセス権限に関連していないため、何らかの理由でFileShare.Noneを制限します。

アクセス許可は、プロセスに(実行するアカウントに基づいて)ファイル/リソースへのアクセスを許可します。アクセスが許可されたプロセスが、必要な共有モードでファイルを開くことができる場合。この共有モードがファイルの既存の共有モードと競合しない場合、要求は成功し、ファイルはこの共有モードになります(前の共有モードと組み合わせて)。詳細については、 CreateFile-dwShareModeセクションを参照してください。

あなたの場合、ログリーダーはファイルを開くための権限を持っている必要があるので、それがファイルを開く最初のプロセスである場合、ShareMode.Noneを設定することができます。devshortsが言うように、問題のあるプロセスを変更したり、ファイルアクセス方法をハッキングしたりする以外にできることはあまりありません(「hookCreateFile」を検索してください)。

補足:ログリーダーが他のプロセスと同じアカウントで実行されている場合、Windowsには「プロセスごとの」アクセス許可がなく、すべてのプロセスが同じユーザーのアクセス許可を共有するため、アクセス許可は1つの追加の理由で役に立ちません。

于 2012-09-03T18:35:33.470 に答える
2

私の知る限り、コードを変更せずに、他のユーザーが別のファイル アクセス モードでファイルを開こうとするのを防ぐことはできません。

于 2012-09-03T17:49:00.133 に答える