Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Запись хэша xml-файла


Автор: ДобренькийПапаша 12.9.2011, 09:34
Мне необходимо каждый раз при считывании xml-файла проверять его хэш и обновлять хэш при изменении файла.
Стал использовать FileSystemWatcher. Настроил, работает. Но проявляется следующая проблема. Иногда XDocument.Load() и XDocument.Save() не успевают закрыть свои потоки чтения, до того как сработает событие Changed класса FileSystemWatcher и тогда я получаю исключение:
Код

public void SettingsFile_OnChanged(object sender, FileSystemEventArgs e)
        {
            WriteHashToSettingsFile(CalculateHash());            
        }

        public static string CalculateHash()
        {           
            StreamReader settingsFileReader = new StreamReader(XmlSettings.DefaultXmlSettingsFilePath); //Исключение, файл занят другим процессом
            string xmlStr = settingsFileReader.ReadToEnd();

            settingsFileReader.Close();

            StringBuilder buff = new StringBuilder();
            if (!string.IsNullOrWhiteSpace(xmlStr))
            {
                int startIndex = xmlStr.IndexOf("<Parameters>");
                int endIndex = xmlStr.IndexOf("<HashCode");

                string xmlStrToHash = xmlStr.Substring(startIndex, endIndex - startIndex);

                SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
                sha1.ComputeHash(Encoding.UTF8.GetBytes(xmlStrToHash));

                byte[] hash = sha1.Hash;
                buff = new StringBuilder();
                foreach (byte hashByte in hash)
                {
                    buff.Append(String.Format("{0:X1}", hashByte));
                }
            }
            return buff.ToString();         
        }


Что можете предложить? Если хорошего способа побороть эту проблему не найдётся, то буду благодарен предложениям по другим способам ведения хеширования и сравнения контрольной суммы без использования FileSystemWatcher'а.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)