0

我在使用 filestream 将字节附加到文件时遇到问题。我有一个客户端应用程序,它拆分文件字节并将其发送到 web 服务 n 次而不是单次发送。

我的网络服务代码如下

 public bool TransferFile(byte[] bytes, ref string token, ref string path, string extension)
    {
        string folderPath = string.Empty;
        if (System.Configuration.ConfigurationManager.AppSettings["DepositPath"] != null)
        {
            folderPath = System.Configuration.ConfigurationManager.AppSettings["DepositPath"].ToString();
        }
        if (string.IsNullOrEmpty(token))
        {
            token = Guid.NewGuid().ToString();            
        }
        path = Path.Combine(folderPath, token + extension);

        if (!File.Exists(path))
        {
            using (FileStream fs = File.Create(path)){
                fs.Dispose();
            }
        }
        using (FileStream stream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.Write))
        {
            stream.Write(bytes, 0, bytes.Length);
            stream.Flush();
            stream.Close();
            stream.Dispose();
        }
        return true;
    }

我已经以附加模式打开文件并附加字节并关闭流。即使我得到了 IOException ,它说文件正在被其他进程使用。我也配置了应用程序池标识。请给我一些解决此问题的想法。

System.Web.Services.Protocols.SoapException:服务器无法处理请求。---> System.IO.IOException:该进程无法访问文件“D:\Development Projects\IAM\FileTransporter\DepositFolder\79ede99d-d76a-4050-959d-17bb87fa6fdb.exe”,因为它正被另一个进程使用。 在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs , String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) at FileTransporterService.Service.TransferFile(Byte[] bytes, String& token, String& path, String extension)在 D:\Development Projects\IAM\FileTransporter\FileTransporterService\Service.asmx.cs:line 36 --- 内部异常堆栈跟踪结束 ---

4

2 回答 2

0

在 if 条件 gc.collect() 之后将重新分配该文件的资源

if (!File.Exists(path))
{
    using (FileStream fs = File.Create(path)){
          fs.Dispose();
    }
}
gc.collect()
于 2013-08-06T12:52:14.720 回答
0

我怀疑当文件不存在时创建文件的第一个 using 语句存在问题。当您尝试使用第二个 using 语句重新打开文件时,操作系统可能不会刷新和关闭此文件。

无论如何,确实没有理由这样做,您可以使用 FileMode.OpenOrCreate 选项创建 FileStream,这与您尝试两次打开文件时所做的相同。此外,没有理由在流上显式调用 Dispose()。if for Dispose 为您调用 using 语句的目的。

尝试这个:

    public bool TransferFile(byte[] bytes, ref string token, ref string path, string extension)
    {
        string folderPath = string.Empty;
        if (System.Configuration.ConfigurationManager.AppSettings["DepositPath"] != null)
        {
            folderPath = System.Configuration.ConfigurationManager.AppSettings["DepositPath"].ToString();
        }
        if (string.IsNullOrEmpty(token))
        {
            token = Guid.NewGuid().ToString();
        }
        path = Path.Combine(folderPath, token + extension);

        using (var stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
        {
            stream.Write(bytes, 0, bytes.Length);
            stream.Flush();
            stream.Close();
        }
        return true;
    }
于 2013-08-06T12:53:02.227 回答