C#WebClient.UploadFileAsync无法访问该文件,因为它';正在被另一个进程使用

C#WebClient.UploadFileAsync无法访问该文件,因为它';正在被另一个进程使用,c#,file-upload,process,webclient,C#,File Upload,Process,Webclient,我正在构建一个简单的应用程序,将计算机上的文件夹与远程服务器同步。我使用FileSystemWatcher检测更改,并使用WebClient上载文件。 问题是,当我试图上传时,我得到一个异常,说该文件已经在使用中。我检查了所有进程,但找不到阻塞的进程。我也试过了,但问题还是一样。 下面是我如何声明FileSysmWatcher的: private void InitFileWatcher() { try { watcher = ne

我正在构建一个简单的应用程序,将计算机上的文件夹与远程服务器同步。我使用FileSystemWatcher检测更改,并使用WebClient上载文件。 问题是,当我试图上传时,我得到一个异常,说该文件已经在使用中。我检查了所有进程,但找不到阻塞的进程。我也试过了,但问题还是一样。 下面是我如何声明FileSysmWatcher的:

private void InitFileWatcher()
    {
        try
        {
            watcher = new FileSystemWatcher();
            watcher.Path = FileManager.getSyncDirPath();
            watcher.EnableRaisingEvents = true;
            watcher.IncludeSubdirectories = true;
            watcher.Created += FileManager.FileCreated;
        }
        catch(Exception)
        {
            Console.WriteLine("Error");
        }
    }
FileManager.FileCreated方法:

public static void FileCreated(object sender, FileSystemEventArgs e) 
    {
        Console.WriteLine("File created: " + e.FullPath);
        while (true)
        {
            try
            {
                using (Stream stream = System.IO.File.Open(e.FullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
                {
                    if (stream != null)
                    {
                        FileUploader uploader = new FileUploader();
                        uploader.Upload(e.FullPath, new Uri("http://192.168.65.1/test/upload.php"));
                        break;
                    }
                }
            }
            catch (FileNotFoundException ex)
            {
                System.Diagnostics.Trace.WriteLine(string.Format("Output file {0} not yet ready ({1})", e.FullPath, ex.Message));
            }
            catch (IOException ex)
            {
                System.Diagnostics.Trace.WriteLine(string.Format("Output file {0} not yet ready ({1})", e.FullPath, ex.Message));
            }
            catch (UnauthorizedAccessException ex)
            {
                System.Diagnostics.Trace.WriteLine(string.Format("Output file {0} not yet ready ({1})", e.FullPath, ex.Message));
            }
            Thread.Sleep(500);
        }
    }
最后是上传方法:

public void Upload(string file, Uri destination)
    {
        WebClient client = new WebClient();
        client.Headers.Add("Content-Type", "binary/octet-stream");
        client.UploadFileAsync(destination, "POST", file);
    }

谢谢你的帮助!:)

您必须尝试下面提到的代码

    public void Upload(string file, Uri destination)
    {
       using (WebClient client=new Webclient())
        {
           client.Headers.Add("Content-Type", "binary/octet-stream");
           client.UploadFileAsync(destination, "POST", file);
        }
    }

它不允许您上载该文件,因为该文件已使用
System.IO.file.Open打开

如果打开文件只是为了检查其存在,那么可以使用

File.Exists(path);

我尝试了两种解决方案的结合,效果更好,但非常不稳定。而且它不适用于“大”文件(我想大于10万个)不稳定是什么意思?它是System.Reflection.TargetInvestment异常。和我以前一样。innerException表示无法访问该文件。我所说的不稳定是指在5次尝试上载时,有3次失败。即使是小文件。