这个应用程序似乎吃了很多内存。也许我没有正确管理内存。有人可以弄清楚需要优化哪些代码。其次,文件复制无法正常工作。它有时会引发异常,无法访问另一个进程正在使用的文件,这个异常在监视文件夹和我正在复制的目标文件夹的两端都被抛出。让我简要介绍一下我在这里想要实现的目标。
我有一个系统,它会给我一个 ansi 格式的 xml 文件。这个文件会定期更新,可能每 3-4 分钟有时甚至 10-20 秒。现在我正在查看这个文件夹,一旦它被更改,我将它转换为 UTF-8 并通过 sftp 将它复制到另一台服务器。此 sftp 文件夹映射到发生转换的同一台机器上。所以我面临的问题是它抛出的异常,无法访问另一个进程正在使用的文件,一段时间后这个 get 被清除。甚至内存异常,即系统内存不足。它也在泄漏内存。从 5k 开始,几个小时后达到 1.2gb 的内存使用量。现在我需要运行 3 个类似的程序来观看 3 个不同的文件夹。我的问题有任何线索吗?
class Test
{
class Class1
{
private static FileSystemWatcher watcher = new FileSystemWatcher();
public static void Main()
{
WatchFile();
Console.ReadLine();
}
private static void WatchFile()
{
watcher.Path = @"c:\test";
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.xml";
watcher.Changed += new FileSystemEventHandler(convert);
watcher.Error += new ErrorEventHandler(WatcherError);
watcher.EnableRaisingEvents = true;
Console.WriteLine("Press \'q\' to quit.");
Console.WriteLine("Press \'q\' to quit.");
while (Console.Read() != 'q') ;
}
public static string CrL = "\r\n";
private static void convert(object source, FileSystemEventArgs f)
{
string FileName = f.FullPath;
string destinationFile = @"z:\xml\test.xml";
Thread.Sleep(2000);
try
{
watcher.EnableRaisingEvents = false;
Encoding utf8 = new UTF8Encoding(false);
Encoding ansi = Encoding.GetEncoding(1256);
Thread.Sleep(2000);
string xml = File.ReadAllText(FileName, ansi);
XDocument xmlDoc = XDocument.Parse(xml);
File.WriteAllText(FileName, @"<?xml version=""1.0"" encoding=""utf-8""?>" + xmlDoc.ToString(), utf8);
if (File.Exists(destinationFile))
File.Delete(destinationFile);
File.Copy(FileName, destinationFile,true);
Console.WriteLine("File Copied"); // for troubleshoooting only
Console.Write(CrL);
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
finally
{
watcher.EnableRaisingEvents = true;
}
}
private static void WatcherError(object source, ErrorEventArgs e)
{
Exception watchException = e.GetException();
watcher = new FileSystemWatcher();
while (!watcher.EnableRaisingEvents)
{
try
{
WatchFile();
Console.WriteLine("I'm Back!!");
}
catch
{
Thread.Sleep(2000);
}
}
}
}
}