4

これが私が考えていることです:

        var file = @"myfile";
        File.Open(file,
                  FileMode.Open, FileAccess.ReadWrite, FileShare.None);

        using (StreamReader rdr = new StreamReader(File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read)))
        {
            rdr.ReadToEnd();
        }
        var t = File.ReadAllBytes(file);

ファイルデータを読み取ることもできませFile.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read)ん。File.ReadAllBytes

私の昔の c++ と winapi の時代から、バックアップ権限があれば、ロックされたファイルを読み取る良い方法があったことを覚えていますが、c# でそれらを取得して使用する方法がわかりません。

ファイルがロックされた後にファイルを読み取る方法のサンプルを誰かに提供してもらえますか?

4

2 に答える 2

6

ファイルが完全にロックされている (共有されていない) 場合、ファイルを読み取ることはできません。ファイルがread を共有するために開かれた場合、非侵入的な方法を使用して読み取ることができます。

string fileName = @"myfile";
using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
using (StreamReader fileReader = new StreamReader(fileStream ))
{
    while (!fileReader .EndOfStream)
    {
        string line = fileReader .ReadLine();
        // Your code here
    }
}
于 2012-06-20T15:52:08.357 に答える
1

私がやろうとしていたことは実際には不可能であり、バックアップ権限も役に立ちません:

       [DllImport("kernel32.dll", CharSet = CharSet.Auto,
        CallingConvention = CallingConvention.StdCall,
        SetLastError = true)]
            public static extern SafeFileHandle CreateFile(
                string lpFileName,
                uint dwDesiredAccess,
                uint dwShareMode,
                IntPtr SecurityAttributes,
                uint dwCreationDisposition,
                uint dwFlagsAndAttributes,
                IntPtr hTemplateFile
            );

    private static uint READ_CONTROL = 0x00020000;
    private static uint OPEN_EXISTING = 3;
    private static uint FILE_FLAG_BACKUP_SEMANTICS = 0x02000000;


        var file = @"myfile";
        File.Open(file,
                  FileMode.Open, FileAccess.ReadWrite, FileShare.None);

        using(PrivilegeEnabler pe = new PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.Backup))
        {
            var hFile = CreateFile(file,           // lpFileName
                       READ_CONTROL,               // dwDesiredAccess
                       0,                          // dwShareMode
                       IntPtr.Zero,                // lpSecurityAttributes
                       OPEN_EXISTING,              // dwCreationDisposition
                       FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes
                       IntPtr.Zero);               // hTemplateFile
            using (var fs=new  FileStream(hFile.DangerousGetHandle(),FileAccess.Read))
            {
                using (StreamReader rdr=new StreamReader(fs))
                {
                    rdr.ReadToEnd();
                }
            }
        }

それでもエラーになります。

于 2012-06-20T17:25:29.373 に答える