c# - 该进程无法访问该文件,因为该文件正在被另一个进程使用

标签 c# file-upload

我正在运行一个程序,其中文件被上传到 IIS 中的文件夹,然后进行处理以从中提取一些值。我使用 WCF 服务来执行该过程,并使用 BackgroundUploader 将文件上传到 IIS。但是,上传过程完成后,我收到错误“该进程无法访问文件 x,因为它正在被另一个进程使用。”基于这里提出的类似问题,我认为相关文件需要位于 using 语句中。我尝试将代码修改为以下内容,但没有成功,而且我不确定它是否正确。

namespace App17
{
public sealed partial class MainPage : Page, IDisposable
{
   private CancellationTokenSource cts;      

    public void Dispose()
    {
        if (cts != null)
        {
            cts.Dispose();
            cts = null;
        }

        GC.SuppressFinalize(this);
    }

    public MainPage()
    {
        this.InitializeComponent();
        cts = new CancellationTokenSource();
    }

    public async void Button_Click(object sender, RoutedEventArgs e)
    {
        try
        {               
            Uri uri = new Uri(serverAddressField.Text.Trim());
            FileOpenPicker picker = new FileOpenPicker();
            picker.FileTypeFilter.Add("*");
            StorageFile file = await picker.PickSingleFileAsync();


            using (var stream = await file.OpenAsync(FileAccessMode.Read))
            {
                GlobalClass.filecontent = file.Name;
                GlobalClass.filepath = file.Path;
                BackgroundUploader uploader = new BackgroundUploader();
                uploader.SetRequestHeader("Filename", file.Name);
                UploadOperation upload = uploader.CreateUpload(uri, file);
                await HandleUploadAsync(upload, true);
                stream.Dispose();
            }


        }

        catch (Exception ex)
        {
            string message = ex.ToString();
            var dialog = new MessageDialog(message);
            await dialog.ShowAsync();
            Log(message);
        }

    }


   private void CancelAll(object sender, RoutedEventArgs e)
   {
       Log("Canceling all active uploads");
       cts.Cancel();
       cts.Dispose();
       cts = new CancellationTokenSource();
   }


   private async Task HandleUploadAsync(UploadOperation upload, bool start)
   {
       try
       {
           Progress<UploadOperation> progressCallback = new Progress<UploadOperation>(UploadProgress);
           if (start)
           {

               await upload.StartAsync().AsTask(cts.Token, progressCallback);
           }
           else
           {
               // The upload was already running when the application started, re-attach the progress handler.
               await upload.AttachAsync().AsTask(cts.Token, progressCallback);
           }

           ResponseInformation response = upload.GetResponseInformation();
           Log(String.Format("Completed: {0}, Status Code: {1}", upload.Guid, response.StatusCode));

           cts.Dispose();
       }

       catch (TaskCanceledException)
       {
           Log("Upload cancelled.");
       }
       catch (Exception ex)
       {
           string message = ex.ToString();
           var dialog = new MessageDialog(message);
           await dialog.ShowAsync();
           Log(message);
       }
   }



   private void Log(string message)
   {
       outputField.Text += message + "\r\n";
   }


   private async void LogStatus(string message)
   {
       var dialog = new MessageDialog(message);
       await dialog.ShowAsync();
       Log(message);
   }


   private void UploadProgress(UploadOperation upload)
   {
       BackgroundUploadProgress currentProgress = upload.Progress;
       MarshalLog(String.Format(CultureInfo.CurrentCulture, "Progress: {0}, Status: {1}", upload.Guid,
           currentProgress.Status));
       double percentSent = 100;
       if (currentProgress.TotalBytesToSend > 0)
       {
           percentSent = currentProgress.BytesSent * 100 / currentProgress.TotalBytesToSend;
       }

       MarshalLog(String.Format(CultureInfo.CurrentCulture,
           " - Sent bytes: {0} of {1} ({2}%), Received bytes: {3} of {4}", currentProgress.BytesSent,
           currentProgress.TotalBytesToSend, percentSent, currentProgress.BytesReceived, currentProgress.TotalBytesToReceive));

       if (currentProgress.HasRestarted)
       {
           MarshalLog(" - Upload restarted");
       }

       if (currentProgress.HasResponseChanged)
       {

           MarshalLog(" - Response updated; Header count: " + upload.GetResponseInformation().Headers.Count);


       }
   }


   private void MarshalLog(string value)
   {
       var ignore = this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
       {
           Log(value);
       });
   }


}

}

完成此操作后,文件名将发送到 WCF 服务,该服务将访问并处理上传的文件以提取某些值。正是在这一点上我收到了错误。我真的很感激一些帮助。

public async void Extract_Button_Click(object sender, RoutedEventArgs e)
    {
      ServiceReference1.Service1Client MyService = new ServiceReference1.Service1Client();
      string filename = GlobalClass.filecontent;            
      string filepath = @"C:\Users\R\Documents\Visual Studio 2015\Projects\WCF\WCF\Uploads\"+ filename;
      bool x = await MyService.ReadECGAsync(filename, filepath);

    }

编辑:添加 using block 之前的代码

     try
        {
            Uri uri = new Uri(serverAddressField.Text.Trim());
            FileOpenPicker picker = new FileOpenPicker();
            picker.FileTypeFilter.Add("*");
            StorageFile file = await picker.PickSingleFileAsync();
            GlobalClass.filecontent = file.Name;
            GlobalClass.filepath = file.Path;
            BackgroundUploader uploader = new BackgroundUploader();
            uploader.SetRequestHeader("Filename", file.Name);
            UploadOperation upload = uploader.CreateUpload(uri, file);
            await HandleUploadAsync(upload, true);
        }

最佳答案

当您使用流编写器时,您实际上创建了一个进程,您可以从任务管理器中将其关闭。在stream.Dispose()之后放置stream.Close()。

这应该可以解决您的问题。

关于c# - 该进程无法访问该文件,因为该文件正在被另一个进程使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37496380/

相关文章:

c# - 在 .NET 中上传超过 4 MB 的文件

c# - LogTrace 和 LogDebug 未出现在控制台或调试窗口中 - .NET 7.0 中的日志记录问题

c# - 自动完成 : Asynchronous population with WCF using threads

c# - protobuf-net 继承 : derived class hides base class property

输入类型 ="file"上的 jQuery 更改方法

javascript - 有没有可靠的方法来测试上传速度?

c# - 使用 jquery 调用 C# 方法

javascript - 使用 ASP.NET Webforms 获取 Javascript 值

php - 如何提供用户上传的图像?

spring - 文件上传在 Primefaces 中不起作用