【问题标题】:Stream or file is not closing流或文件未关闭
【发布时间】:2012-05-20 07:00:05
【问题描述】:

我有他下面的代码

    HttpPostedFileBase files = Request.Files[0];
    Stream fileStream = files.InputStream;

    using (Stream file = System.IO.File.OpenWrite(originalImage))
    {
        StreamUtil.CopyStream(fileStream, file);
        file.Close();
        fileStream.close();
        fileStream.dispose();
    }

    // here is CopyStream method

    public static void CopyStream(Stream input, Stream output)
    {
        var buffer = new byte[8*1024];
        int len;
        while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            output.Write(buffer, 0, len);
        }
    }

当我尝试两次写入同一个文件时,我得到了

The process cannot access the file \u0027D:FILENAME because it is being used by another process

我怎样才能关闭它?所以一旦请求写入完成,它将被关闭?

【问题讨论】:

  • 什么是fileStream?它来自哪里?
  • 更新了代码,它来自请求。
  • 在您尝试再次写入同一个文件时每次都会发生这种情况吗?您是否尝试使用filemon 查看锁定文件的进程?
  • 是的,每次我上传同一个文件时都会发生这种情况。

标签: c# asp.net-mvc-3 file stream


【解决方案1】:

我想把它写成评论,但不清楚:

尝试做这样的事情:

MemoryStream fileStream = new MemoryStream();

fileStream.WriteByte(04);

using (Stream file = System.IO.File.OpenWrite(originalImage))
{
    CopyStream(fileStream, file);
}

using (Stream file = System.IO.File.OpenWrite(originalImage))
{
    CopyStream(fileStream, file);
}

在第二个 using 行是否也出现同样的错误?

【讨论】:

  • 我正在尝试检查如果您在关闭文件后立即打开文件是否收到相同的消息(因为我认为该文件没有从您发布的代码中锁定,而是从其他地方锁定)。如果您尝试打开它两次,但您不会收到消息,则可以确定该文件已从其他地方锁定。
  • 这真的不是一个有效的解决方案我所做的是将日期时间刻度添加到文件名,这样它就不会再次成为同一个文件
  • 我说我想把它写成评论而不是答案......但从你的回答我想我知道发生了什么!我认为您从多个线程运行相同的代码使用相同的文件名,然后如果两个线程同时运行,那么第一个线程将成功打开文件,第二个线程将收到错误信息。我说的对吗?
  • 这意味着您在第二个 Stream file = System.IO.File.OpenWrite(originalImage) 调用上遇到异常???
  • 我没试过。我的解决方法是将日期时间添加到文件的开头,因此每次用户上传时都会创建一个新文件。
猜你喜欢
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 2012-05-25
  • 2011-11-14
  • 2012-02-07
  • 1970-01-01
相关资源
最近更新 更多