【问题标题】:How can I open a file when it is already opened by other user in system?当文件已被系统中的其他用户打开时,如何打开文件?
【发布时间】:2016-05-26 06:05:34
【问题描述】:
PD4ML pd4ml = new PD4ML();
pd4ml.enableTableBreaks(true);
pd4ml.PageInsets = new System.Drawing.Rectangle(5, 5, 5, 5);
pd4ml.PageSize = PD4Constants.getSizeByName("LETTER");
Byte[] byteArray = Encoding.ASCII.GetBytes(content);
MemoryStream stream = new MemoryStream(byteArray);

FinalPath = FinalPath + @"\" + VersionID;
        if (!Directory.Exists(FinalPath))
            Directory.CreateDirectory(FinalPath);

string FileName = FinalPath +FileName+ ".pdf";

pd4ml.render(stream,new System.IO.FileStream(FileName, System.IO.FileMode.CreateNew));        
stream.Flush();
stream.Close();
stream.Dispose();

//In another method I'm opening this file
File stream fs = File.Open(path, FileMode.Open, FileAccess.Read);`

我正在使用 pd4ml.render() 方法生成 PDF。当我使用渲染方法创建这个文件时,它会在系统内部的某个地方打开。这就是为什么当我尝试使用 Filestream fs=new Filestream(path,FileMode.Open,FileAccess.Read) 手动打开它时

它抛出异常并且文件正在被另一个进程使用。请指导我该怎么做。

我已经在我的代码中使用了 FileShare.ReadWrite 属性和 File.OpenRead(path),但它对我不起作用。

【问题讨论】:

  • 尝试使用 (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
  • 为什么不先关闭呢?
  • 但要关闭它,我必须先打开它,当我尝试打开它时,它给了我异常。而且我使用过 FileShare.ReadWrite 但它对我不起作用。
  • 你在创建一个新文件吗??
  • 是的,我正在使用 pd4ml.render(stream, new System.IO.FileStream(FileName, System.IO.FileMode.CreateNew)) 创建一个新文件。在这个创建文件在系统内部某个我无法检测到的地方打开之后。

标签: c# pd4ml


【解决方案1】:

您正在泄漏应该处理的流对象。具体来说,这里作为 second 参数传递的那个:

pd4ml.render(stream,new System.IO.FileStream(FileName, System.IO.FileMode.CreateNew));

与其将新流创建为该方法调用的一部分,不如将其放在另一个变量中并Dispose 它(最好使用using 对其和stream 的语句,而不是手动)。

using(var stream2 = new System.IO.FileStream(FileName, System.IO.FileMode.CreateNew))
{
  pd4ml.render(stream,stream2);
}

【讨论】:

    【解决方案2】:

    您的问题是File.Create 将打开一个stream 允许您对文件执行您喜欢的操作:http://msdn.microsoft.com/en-us/library/d62kzs03.aspx

    因此,从技术上讲,它已经在使用了。

    只需完全删除 File.Create。如果文件不存在,StreamWriter 将处理创建文件。

    使用流时最好这样做

    using (Stream s = new Stream())
    {
    } // Stream closes here
    If you also create the output stream, make sure to close it.
    

    参考http://www.codeproject.com/Questions/1097511/Can-not-opening-pdfs-generated-using-pd-ml-using-C

    【讨论】:

    • 我正在使用 pd4ml 对象创建文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2011-04-21
    • 2021-08-03
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    相关资源
    最近更新 更多