Приложение WPF аварийно завершилось после использования File.WriteAllText и File.ReadAllText.C#

Место общения программистов C#
Ответить
Anonymous
 Приложение WPF аварийно завершилось после использования File.WriteAllText и File.ReadAllText.

Сообщение Anonymous »

Я создал приложение WPF. Существует один экземпляр приложения, который всегда работает в фоновом режиме (без пользовательского интерфейса), который действует как служба для обнаружения новых сообщений от API. Когда он обнаруживает новое сообщение, он записывает текст в текстовый файл. Другой экземпляр при запуске имеет пользовательский интерфейс, он прослушивает изменения в файле и выполняет определенные действия на основе содержимого текстового файла. Проблема, с которой я сталкиваюсь, заключается в том, что иногда приложение аварийно завершает работу при его запуске (пример с пользовательским интерфейсом). Я подозревал, что это из-за файла, поэтому попробовал:
  • Я вручную изменил текстовый файл, но не смог его сохранить. Всякий раз, когда я нажимал «Сохранить», содержимое не менялось. Сообщений об ошибках также не отображается.
  • Я удалил текстовый файл и снова запустил приложение. Это сработало.
    Я не мог понять, в чем причина, поскольку сообщения об ошибке не показывалось. Любое понимание было бы здорово. Спасибо.
Компонент, используемый для записи сообщения в текстовый файл:
private Task WriteMessageToFile()
{
try
{
string folderPath = @"C:\ProgramData\Service";
string filePath = Path.Combine(folderPath, "Message.txt");

if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}

File.WriteAllText(filePath, "some_message_string");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

return Task.CompletedTask;
}

ViewModel:
public class MainViewVM : ViewModelBase
{
FileWatcherService _fileWatcherService = new();
private string file = "Message.txt";
private string filePath = @"C:\ProgramData\Service";

// CONSTRUCTOR
public MainViewVM()
{
_fileWatcherService.FileChanged += OnFileChanged;
}

private void OnFileChanged(object sender, FileSystemEventArgs e)
{
HandleNavigation();
}

private void HandleNavigation()
{
try
{
string fullPath = Path.Combine(filePath, file);
if (File.Exists(fullPath))
{
string fileContent = File.ReadAllText(fullPath);

// if there is text in the file, do something, then clear the file
if (!string.IsNullOrEmpty(fileContent))
{
// DO SOMETHING
File.WriteAllText(fullPath, "");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}

FileWatcherService:
public class FileWatcherService
{
FileSystemWatcher watcher;
public FileWatcherService()
{
CreateFileWatcher();
}
public event EventHandler FileChanged;

public void CreateFileWatcher()
{
watcher = new FileSystemWatcher(@"C:\ProgramData\DPMService", "Message.txt")
{
NotifyFilter = NotifyFilters.Attributes
| NotifyFilters.CreationTime
| NotifyFilters.DirectoryName
| NotifyFilters.FileName
| NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.Security
| NotifyFilters.Size
};

watcher.Changed += MakeANote;
watcher.Created += MakeANote;
watcher.Deleted += MakeANote;
watcher.Renamed += MakeANote;
watcher.Filter = "*.*";
watcher.IncludeSubdirectories = true;
watcher.EnableRaisingEvents = true;
}

internal void Dispose()
{
if (watcher != null)
{
watcher.Changed -= MakeANote;
watcher.EnableRaisingEvents = false;
watcher.Dispose();
}
}

private void MakeANote(object sender, FileSystemEventArgs e)
{
FileChanged?.Invoke(this, e);
}
}


Подробнее здесь: https://stackoverflow.com/questions/785 ... eadalltext
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»