【解決方法】フォルダーの名前が変更可能かどうかを確認するにはどうすればよいですか?


1. 共有ネットワーク ドライブ上のフォルダーの名前を変更する必要があるアプリケーションがあります。

2. これらのフォルダーにはサブフォルダーがあり、サブフォルダー内にファイルが存在する可能性があります。

3. これらのファイルの 1 つ以上が、ユーザーのコンピュータまたはネットワーク上の別のコンピュータ上のアプリケーションで開かれている可能性があります。

条件 #3 が true の場合、フォルダー名の変更は失敗します。 ユーザーにはエラー メッセージが表示されますが、自分のマシンで何を閉じるべきかという問題に直面し、さらに悪いことに、誰がファイルを開いているのかを見つけるためにオフィス内を歩き回らなければならない場合もあります。

開いているファイルのリストを提示するとよいでしょう。

以下に、現時点で私が持っているコードを示します。 一部のアプリケーションで開かれているファイルでは機能するようですが、他のアプリケーションでは機能しないようです。 たとえば、ファイルが Notepad または Notepad++ で開かれている場合、私のコードは問題を検出しませんが、Windows は親フォルダーの名前の変更を拒否するため、Notepad がファイルを開いていることを明らかに検出できます。

これを行う方法はありますか?

私が試したこと:

private void TestFunction( string folderPath )
{
    List<string> fileList = Directory.GetFiles( folderPath, "*", SearchOption.AllDirectories ).ToList();
    List<string> filteredFileList = fileList.Where( f => IsFileLocked( f ) ).ToList();
}

private bool IsFileLocked( string filePath )
{
    try
    {
        FileInfo fileInfo = new FileInfo( filePath );
        using( FileStream stream = fileInfo.Open( FileMode.Open, FileAccess.ReadWrite, FileShare.None ) )
        {
            stream.Close();
        }
    }
    catch( IOException )
    {
        return true;
    }
    return false;
}

解決策 1

より良い解決策は、フォルダーの名前を変更しないことです。代わりに、「希望の名前」と新しい名前への参照を持つデータベースを作成します。 そうすることで、ユーザーはフォルダー名の変更によって不便を感じることがなくなります (変更は MRU リストに反映されないため、どこに行けば元に戻せるか分からない可能性があります)。

フォルダーの名前を変更しようとして失敗した場合は、古いパスと新しいパスを DB に記録し、名前の変更が完了するまで定期的にチェックされる混合システムを導入することもできます。 そのタスクは、ファイル サーバー上で 1 時間ごとに実行されるようにスケジュールできます。

正当なビジネス ルールによって「アクティブ」フォルダーの名前を変更するよう強制された場合、おそらくそうするでしょう。

コメント

タイトルとURLをコピーしました