5

他の複製されたサービスがファイルにアクセスできないように、ファイルをロックしようとしています。次に、ファイルを読み取り、終了したらファイルを移動します。移動は、を使用して許可されFileShare.Deleteます。

ただし、後のテストで、ネットワーク共有を調べている場合、このアプローチは機能しないことがわかりました。私のアプローチが最善ではなかったかもしれないことを感謝しますが、私の具体的な質問は次のとおりです。

以下のデモがローカルファイルに対して機能するのに、ネットワークファイルに対しては機能しないのはなぜですか?

ネットワーク共有がローカルディスクとは異なる動作をすることを示す情報が検索でほとんど見つからなかったため、具体的であればあるほどよいでしょう。

string sourceFile = @"C:\TestFile.txt";
string localPath = @"C:\MyLocalFolder\TestFile.txt";
string networkPath = @"\\MyMachine\MyNetworkFolder\TestFile.txt";

File.WriteAllText(sourceFile, "Test data");

if (!File.Exists(localPath))
    File.Copy(sourceFile, localPath);

foreach (string path in new string[] { localPath, networkPath })
{
    using (FileStream fsLock = File.Open(path, FileMode.Open, FileAccess.ReadWrite, (FileShare.Read | FileShare.Delete)))
    {
        string target = path + ".out";
        File.Move(path, target); //This is the point of failure, when working with networkPath

        if (File.Exists(target))
            File.Delete(target);
    }

    if (!File.Exists(path))
        File.Copy(sourceFile, path);
}

編集:ロックが設定されている間にファイルをあるネットワーク共有から別のネットワーク共有に移動したい場合は、これが機能することを言及する価値があります。この問題は、ファイルがロックされているときに同じファイル共有内でファイルを移動した場合にのみ発生するようです。

4

1 に答える 1

3

System.IO.File.Open()はWin32 API関数CreateFile()にマップされていると思います。この関数に関するMicrosoftのドキュメント[ http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx ]には、次のように記載されています。

WindowsServer2003およびWindowsXP/ 2000:dwDesiredAccessパラメーターの値がDELETEアクセスフラグ(0x00010000)であるか、またはその他のアクセスフラグであり、リモートファイルまたはディレクトリがFILE_SHARE_DELETEで開かれていません。このシナリオでの共有違反を回避するには、DELETEアクセス権のみを使用してリモートファイルまたはディレクトリを開くか、最初にファイルまたはディレクトリを開いて削除せずにDeleteFileを呼び出します。

これによると、ファイルアクセスパラメータとしてDELETEをIO.File.Open()に渡す必要があります。残念ながら、DELETE列挙はオプションとして含まれていませんでした。

この問題は、Windows2003以前にのみ関係します。Windows 2008 R2 SP1でコードをテストしましたが、正常に動作します。したがって、Windows2008でも機能する可能性があります。

于 2011-07-20T17:24:43.750 に答える