FileSystemWatcher:System.IO.IOException(“另一个进程使用的文件”)

时间:2018-03-29 08:26:02

标签: c# ioexception filesystemwatcher

目前我正在开发一个应用程序,该应用程序应该查看特定目录以进行更改(比如创建一个新文件),然后将文件上传到Sharepoint。因此,我正在使用FileSystemWatcher类,它抛出一个事件,其中包含创建文件的路径,而后者又使用另一种方法上传文件。问题是:在Visual Studio的调试模式下,我意识到我在监视目录中创建的第一个文件被完美上传,即使我一次将多个文件拖到目录中所有都被上传,但是当我在一个文件中执行它之后另一个我得到一个例外,第二个文件已被使用。所以我将File1.txt拖到目录中,它可以工作,但是,当我在尝试创建一个文件流上传到Sharepoint告诉我file2时,我得到一个System.IO.IOException后立即将file2.txt拖到目录中。 txt正在被另一个进程使用。

FileSystemWatcher的代码:

 public void StartWatcher()
        {
            FileSystemWatcher fsw = new FileSystemWatcher(this.path);

            fsw.IncludeSubdirectories = true;

            fsw.EnableRaisingEvents = true;



            fsw.Created += new FileSystemEventHandler(CreateFile);


            try
            {

                while (true)
                {
                    fsw.WaitForChanged(WatcherChangeTypes.All);
                }
            }
            catch
            { }

                fsw.EnableRaisingEvents = false;

        }

调用的CreateFile()方法
fsw.Created += new FileSystemEventHandler(CreateFile);

看起来像这样:

 private void CreateFile(object sender, FileSystemEventArgs e)
        {
            path = String.Format(e.FullPath);
            filename = Path.GetFileName(path);
            Stream fs = File.OpenRead(@path);
            SPAPI spobj = new SPAPI();
            spobj.SPUploader(fs, filename);
            fs.Close();
        }

抛出异常
Stream fs = File.OpenRead(@path);

但仅当第二个文件被拖入第一个文件后的目录中时。奇怪的是,不是第一个文件正在使用,而是第二个我想要作为流打开的文件。因此,流不是仍然打开并导致异常的流。似乎FileSystemWatcher正在使用第二个文件。但是为什么第一个文件工作正常但是当第二个文件被拖入目录时抛出异常?

1 个答案:

答案 0 :(得分:0)

您可以像这样修改和使用。我希望这可以帮助你

private void CreateFile(object sender, FileSystemEventArgs e)
{
    int until = 5;
    int i = 0;
    bool success = false;
    while (!success && i < until)
    {
        try
        {
            path = String.Format(e.FullPath);
            filename = Path.GetFileName(path);
            using (Stream fs = File.OpenRead(@path);)
            {
                SPAPI spobj = new SPAPI();
                spobj.SPUploader(fs, filename);
            }
            success = true;
        }
        catch
        {
            i++;
            Thread.Sleep(TimeSpan.FromSeconds(1));
        }
    }
}