質問

他のクローンサービスがファイルにアクセスできないように、ファイルをロックしようとしています。次に、ファイルを読み取り、終了したらファイルを移動します。移動は使用することで許可されます 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);
}

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

役に立ちましたか?

解決

system.io.file.open()は、win32 API関数createfile()にマップします。この関数に関するMicrosoftのドキュメントで[ http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx ]、それは次のように言及しています:

Windows Server 2003およびWindows XP/2000:DWDesiredAccessパラメーターの値が削除アクセスフラグ(0x00010000)である場合、リモートコンピューターで削除のファイルまたはディレクトリを開く試みが行われた場合、共有違反が発生します。その他のアクセスフラグ、およびリモートファイルまたはディレクトリは、file_share_deleteで開かれていません。このシナリオで共有違反を回避するには、削除アクセスのみを備えたリモートファイルまたはディレクトリを開きます。または、削除のためにファイルまたはディレクトリを最初に開くことなくdeleteFileを呼び出します。

これによれば、fileaccessパラメーターとしてdeleteをio.file.open()に渡す必要があります。残念ながら、削除列挙はオプションとして含まれていませんでした。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top