我对Windows世界还很陌生,因为我的主要开发大多是UNIX系统。来自客户的特定请求进来并询问我是否可以编写Windows服务以查看任何下载内容的“下载”文件夹,并将其移至“文档”文件夹。出于某种原因,他们并不想只是在浏览器上更改其默认下载目录。
所以,为了给顾客他们的要求,我想我会试一试。这是我的尝试:
protected override void OnStart(string[] args)
{
watch();
}
public void OnDebug()
{
OnStart(null);
}
protected override void OnStop()
{
}
String path = null;
private void watch()
{
FileSystemWatcher watcher = new FileSystemWatcher();
string pathUser = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
path = Path.Combine(pathUser, "Downloads");
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
String pUser = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
String directoryName = Path.Combine(pUser, "Documents"); ;
DirectoryInfo dirInfo = new DirectoryInfo(directoryName);
if (dirInfo.Exists == false)
Directory.CreateDirectory(directoryName);
List<String> MyFiles = Directory
.GetFiles(path, "*.*", SearchOption.AllDirectories).ToList();
foreach (string file in MyFiles)
{
FileInfo mFile = new FileInfo(file);
// to remove name collusion
if (new FileInfo(dirInfo + "\\" + mFile.Name).Exists == false)
mFile.MoveTo(dirInfo + "\\" + mFile.Name);
}
}
我在调试模式下测试了我的代码,当服务运行并且我去下载文件时,下载失败。然后Visual Studio会弹出以下错误:
"An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll
Additional information: The process cannot access the file because it is being used by another process."
引发错误:
mFile.MoveTo(dirInfo + "\\" + mFile.Name);
我该如何解决这个问题?
答案 0 :(得分:0)
您的下载开始,并在下载文件夹中创建一个临时文件,该文件开始接收下载流。但是,一旦创建了临时文件,您的移动应用程序就会尝试拦截并移动显然被另一个进程锁定的文件,因为下载客户端仍在写入该文件。 也许你可以在下载文件夹中缓存文件列表以及文件大小并检查它以确保在移动之前大小没有改变。您还可以排除与下载相关的已知扩展名。例如。 * .temp,* .downloading 当您处理用户可以随时锁定文件的实时文件系统时,您可能还希望更优雅地处理锁定的文件异常。