Skip to main content
 首页 » 编程设计

c#之系统文件观察器 C# 锁定目录

2024年01月31日31exmyth

我有一个系统文件观察器,它在 C# 中监视用户的下载目录。该程序是一个 Windows 服务,每次它找到一个已放入或下载到下载目录的文件时,文件就会移动到另一个目录.当服务正在运行时,尝试下载时会失败。 Chrome 只是说 Failed - Download error,没有说明错误是什么。我只能假设我的 Windows 服务通过观看锁定目录,因此无法下载任何内容。关闭windows服务后,我又可以正常下载了。我是 C# 的新手,所以我不熟悉常见错误,但这是我的代码:

    private void watch() 
    { 
        string pathUser = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 
        path = Path.Combine(pathUser, "Downloads"); 
        watcher.Path = path; 
        watcher.NotifyFilter = NotifyFilters.LastWrite 
                     | NotifyFilters.FileName; 
        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 = Destination; 
        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) 
            { 
                bool flag = true; 
                while (flag) 
                { 
                    if (!IsFileLocked(file, 1)) 
                    { 
                        mFile.MoveTo(dirInfo + "\\" + mFile.Name); 
                        flag = false; 
                    } 
                } 
 
 
            }     
        } 
    } 

更新 我尝试在移动之前过滤掉临时下载扩展,但我似乎仍然遇到错误。这是我的尝试:

    String[] ignoreExt = { "crdownload","download", "temp", "tmp"}; 
 
    private void OnChanged(object source, FileSystemEventArgs e) 
    { 
        String pUser = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 
 
        String directoryName = Destination; 
        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) 
            { 
                bool flag = true; 
                while (flag) 
                { 
                    if (!IsFileLocked(file, 1)) 
                    { 
                        if (mFile.Extension != ignoreExt[0] || mFile.Extension != ignoreExt[1] || mFile.Extension != ignoreExt[2] || mFile.Extension != ignoreExt[3]) 
                        { 
                            mFile.MoveTo(dirInfo + "\\" + mFile.Name); 
                           // Clipboard.SetText(dirInfo + "\\" + mFile.Name); 
                            flag = false; 
                        } 
                    } 
                }                     
            }     
        } 
    } 

请您参考如下方法:

当您使用 Chrome 下载内容时,它会创建一个 Unconfirmed 文件,如下所示:Unconfirmed 50329.crdownload

我通过将此文件拖走在我的系统上手动测试它,结果 -> 无法下载 - 错误

我认为您的服务正在移动此文件,Chrome 无法完成下载。

编辑:

对于 Chrome 下载文件的示例,您可以这样检查文件扩展名:

if(mFile.Extension != "crdownload") 
{ 
    ... 
} 

MSDN FileSystemInfo.Extension

编辑 2: 使用列表代替数组:

List<String> ignoreExt = new  List<String>() { "crdownload","download", "temp", "tmp"}; 

然后你可以像这样检查你的扩展:

if (ignoreExt.Where(x => x == mFile.Extension).ToList().Count == 0) 
{ 
    mFile.MoveTo(dirInfo + "\\" + mFile.Name); 
   // Clipboard.SetText(dirInfo + "\\" + mFile.Name); 
    flag = false; 
} 

确保您正在使用 System.Linq;

通过这种方式,您可以添加一些新的扩展,而无需考虑无数行;)