不考虑锁的文件只读访问(C#)

不考虑锁的文件只读访问(C#),c#,io,C#,Io,如何打开(使用c#)已打开的文件(例如,在MS Word中)?我想如果我打开文件进行读取访问,例如 FileStream f= new FileStream('filename', FileMode.Open, FileAccess.ReadWrite); 我应该成功,但我有一个例外: “进程无法访问该文件 因为它是锁着的……” 我知道必须有一种方法来读取文件,而不考虑文件上是否放置了任何锁,因为我可以使用windows资源管理器来复制文件或使用另一个程序(如记事本)打开文件,即使它是在WOR

如何打开(使用c#)已打开的文件(例如,在MS Word中)?我想如果我打开文件进行读取访问,例如

FileStream f= new FileStream('filename', FileMode.Open, FileAccess.ReadWrite);
我应该成功,但我有一个例外:

“进程无法访问该文件 因为它是锁着的……”

我知道必须有一种方法来读取文件,而不考虑文件上是否放置了任何锁,因为我可以使用windows资源管理器来复制文件或使用另一个程序(如记事本)打开文件,即使它是在WORD中打开的


然而,似乎C#中的所有文件IO类都不允许我这样做。为什么?

您的代码正在使用FileAccess.Read*Write*标志。尝试直接读取。

您想设置FileAccess=Read和FileShare=ReadWrite。下面是一篇关于这方面的好文章(并解释原因):


我知道这是一篇老文章。但我需要这个,我认为这个答案可以帮助其他人

以资源管理器的方式复制锁定的文件

尝试使用此扩展名方法获取锁定文件的副本

用法示例 扩展方法
内部静态类锁定文件
{
/// 
///制作已锁定以便在其他主机应用程序中使用的文件的副本。
/// 
///带文件路径的字符串。
公共静态字符串CopyLocked(此FileInfo源文件,字符串CopyStartGet=null)
{
如果(源文件为空)
抛出新ArgumentNullException(nameof(sourceFile));
如果(!sourceFile.Exists)
抛出新的InvalidOperationException($“参数{nameof(sourceFile)}:文件应该已经存在!”);
if(string.IsNullOrWhiteSpace(copyTartget))
CopyStartGet=Path.GetTempFileName();
使用(var inputFile=new FileStream)(sourceFile.FullName,FileMode.Open,
FileAccess.Read,FileShare.ReadWrite)
使用(var outputFile=newfilestream(copyrattget,FileMode.Create))
CopyTo(outputFile,0x10000);
返回copyrtartget;
}
}

对不起,我实际上是在使用FileAccess。请阅读
private static void Main(string[] args)
    {
        try
        {
            // Locked File
            var lockedFile = @"C:\Users\username\Documents\test.ext";

            // Lets copy this locked file and read the contents
            var unlockedCopy = new 
            FileInfo(lockedFile).CopyLocked(@"C:\Users\username\Documents\test-copy.ext");

            // Open file with default app to show we can read the info.
            Process.Start(unlockedCopy);
        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.Message);
        }
    }
internal static class LockedFiles
{
    /// <summary>
    /// Makes a copy of a file that was locked for usage in an other host application.
    /// </summary>
    /// <returns> String with path to the file. </returns>
    public static string CopyLocked(this FileInfo sourceFile, string copyTartget = null)
    {
        if (sourceFile is null)
            throw new ArgumentNullException(nameof(sourceFile));
        if (!sourceFile.Exists)
            throw new InvalidOperationException($"Parameter {nameof(sourceFile)}: File should already exist!");

        if (string.IsNullOrWhiteSpace(copyTartget))
            copyTartget = Path.GetTempFileName();

        using (var inputFile = new FileStream(sourceFile.FullName, FileMode.Open, 
        FileAccess.Read, FileShare.ReadWrite))
        using (var outputFile = new FileStream(copyTartget, FileMode.Create))
            inputFile.CopyTo(outputFile, 0x10000);

        return copyTartget;
    }
}