3

ユーザーがxmlファイルを開いたり、作成したり、保存したりできるWindowsフォームアプリがあります。通常、ファイルはネットワーク フォルダに保存されます。特定のファイルを一度に 1 人のユーザーだけが開くことができるようにする必要があります。xml ファイルはツリー コントロールにロードされ、セッション中に頻繁に保存されます。(ほとんどの場合、ツリー ノードがクリックされます) 次のようにファイルを開きます。

FileStream fs = new FileStream(m_Filename, FileMode.Open);
XmlReader reader = new XmlTextReader(fs);
XmlSerializer deserializer = new XmlSerializer(typeof(BaseBoardTest));
m_TestNodes = (BaseBoardTest)deserializer.Deserialize(reader);
fs.Close();

次のように保存します。

TextWriter writer = new StreamWriter(filename);
XmlSerializer serializer = new XmlSerializer(typeof(BaseBoardTest));
serializer.Serialize(writer, m_TestNodes);
writer.Close();

別のユーザーがファイルを開こうとしたり、名前を付けて保存して上書きしようとした場合に、どのユーザー/コンピューター名がファイルを開いているかを示すメッセージを表示したいと思います。ファイルを開くときにロックファイルを作成することを検討しています。これを処理するより良い方法はありますか?

4

4 に答える 4

2

追加情報を表示したい場合は、ロックファイルが唯一の方法です。

于 2012-12-12T15:53:05.760 に答える
1

別のユーザーがファイルを開いたときにユーザーがファイルを開かないようにする場合は、FileShare.None列挙型が必要になります。

交換する必要があります

new FileStream(m_Filename, FileMode.Open);

new FileStream(m_Filename, FileMode.Open, FileAccess.ReadWrite, FileShare.None)

FileShare.Noneの詳細については、http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspxを参照してください。

注:ファイルを開こうとしたときに発生した例外を必ずキャッチしてください。1人のユーザーがファイルを開いた場合、ファイルを開くための後続の要求はSystem.IO.IOException、ファイルが閉じられるまでを発生させます。

于 2012-12-12T16:00:19.880 に答える
0

書き込みアクセスのみをロックすることでこれを処理できます。これにより、他のユーザーが引き続きファイルを読み取ることができます。

using (FileStream fs = new FileStream(m_Filename, FileMode.Open, FileAccess.ReadWrite, FileShare.Read))
{
   XmlReader reader = new XmlTextReader(fs);
   XmlSerializer deserializer = new XmlSerializer(typeof(BaseBoardTest));
   m_TestNodes = (BaseBoardTest)deserializer.Deserialize(reader);
   fs.Close();

   TextWriter writer = new StreamWriter(filename);
   XmlSerializer serializer = new XmlSerializer(typeof(BaseBoardTest));
   serializer.Serialize(writer, m_TestNodes);
   writer.Close();
}
于 2012-12-12T15:53:20.313 に答える
0

これは、同期ロガー機能の一部です。書き込みが完了するまでアクセスできず、スレッドセーフです。

internal class WriteToLockedFile
    {
        internal static string Uri { get; set ; }
        private static readonly object _syncObject = new object();

        public static void WriteToFile(string logMessage)
        {
            using (var stream = TextWriter.Synchronized( File.AppendText(Uri)))
            {
                lock (_syncObject) 
                {
                    stream.WriteLine(" {0}", logMessage); stream.Flush(); 
                }
            }
        }
    }
于 2012-12-12T15:57:47.380 に答える