2

私は C# 用の 16 進エディター コントロールを使用しています。ソース コードとバイナリ ファイルはここにあります。

それを使用する際の問題の 1 つは、ファイルが 16 進エディターと別のプログラムにロードされた場合、別のプロセスによって既に使用されているため、別のプログラムがそのファイルを保存できないことでした。

そこで、コントロールの作成者に、FileByteProvider および DynamicFileByteProvider クラスの File.Open メソッドの FileShare 引数を ReadWrite (元は Read のみでした) に設定するように依頼したところ、修正されました。だから私はそれをしましたが、それでもうまくいきませんでした(同じエラー)。書き込み専用に設定しても機能しませんでしたが、読み取り専用となしの両方に設定すると機能します。ファイルには、メモ帳などのどのプログラムでも同じ問題があります。それらは ReadOnly などに設定されていないため、なぜ機能しないのかわかりません。

ここに欠けているものはありますか?

4

2 に答える 2

9

問題は他のプログラムにある可能性があります。そのプログラムがファイルを排他的アクセス (共有なし) で開こうとしている場合、プログラムがどのようにファイルを開いたかに関係なく、失敗します。


プログラムがファイルを開こうとするときはいつでも、FileAccess および FileShare パラメーターを指定します (明示的に渡されない場合は既定値が使用されます)。

次に Windows がしなければならないことは、既存の開いているすべてのファイル ハンドルをチェックし、互換性があるかどうかを判断することです。それで、あなたの FileAccess パラメーターを他のすべての人の FileShare パラメーターと比較します。次に、逆のチェックを実行します。FileShare パラメーターが FileAccess パラメーターと一致しているかどうか。-彼らは、あなたが喜んでやっていることをやっていますか? 両方のチェックに合格した場合にのみ、特定のオープン リクエストが承認されます。

Process Monitorなどを使用して、 CreateFileに対して発行される Win32 呼び出しを実際に監視し、各プロセスが実際に何を行っているかを確認できます。


メモ帳は、読み取り/書き込み用に共有されているファイルを開くことはできますが、ファイルに書き戻すことはできません。サンプルプログラム:

using System.IO;

namespace ConsoleApplication2
{
    class Program
    {

        static void Main(string[] args)
        {
            var fs = new FileStream(@"C:\Bar.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
            fs.Write(System.Text.Encoding.ASCII.GetBytes("abc"),0,3);
            fs.Flush();
            fs.Close(); //<-- Breakpoint here
        }
    }
}

指定されたブレークポイントを設定し、プログラムを実行します。ブレークポイントに到達したら、メモ帳を開き、それを使用して C:\Bar.txt を開きます。すべて順調。ファイルにテキストを追加し、保存をクリックします。エラー メッセージが表示されます。

于 2011-01-14T10:13:19.597 に答える
0
  1. 読み書きに変更します。
  2. 再コンパイルします。
  3. まだ開いたことのないファイルを開いてみて、問題が発生するかどうかを確認してください。

おそらく、ファイルを適切に閉じていなかったため、アプリケーションを閉じた後もファイルが開いたままになっています (以前のアクセス許可が読み取りに設定されていました)。

于 2011-01-14T10:09:54.930 に答える