9

IronPython スクリプトを使用してディレクトリを作成しようとすると、C# プロジェクトで奇妙な問題が発生します。これはコードです:

targetTemplateDirectory = Path.Combine(Data, "Templates\\CheckedReports")

if not Directory.Exists(targetTemplateDirectory):
    Directory.CreateDirectory(targetTemplateDirectory)

問題は、同じ名前のファイルまたはディレクトリが既に存在するためIOException、フォルダーを作成できないということです。"H:\ProductName\Data\Templates\CheckedReports"

MSDN によるとDirectory.CreateDirectory()、ディレクトリが既に存在する場合、メソッドは例外をスローしません。

「 」という名前のファイルCheckedReportsがこの例外の理由である可能性があることはわかっていますが、顧客がそのファイルを手動で作成した可能性は非常に低いです。それに加えて、" CheckedReports" という単語を含むコード行はありません (前述のスクリプト以外)。さらに、このアプリケーションは数千人の顧客に使用されており、スクリプトはすべてのマシンで実行されましたが、この問題を報告した顧客は 1 人だけでした。

同名ファイル以外でこの例外が発生する可能性はありますか? アクセス許可、リムーバブル メディア、またはネットワーク ドライブに関連するものでしょうか。

4

2 に答える 2

9

これを 1 人のユーザーだけに使用するのは少しやり過ぎですが、その名前のファイルが存在するかどうかを確認できるはずです。

FileInfo myFile = new FileInfo(targetTemplateDirectory);
if (myFile.Exists)
    myFile.Delete();

if (!Directory.Exists(targetTemplateDirectory))
    Directory.CreateDirectory(targetTemplateDirectory);

I/O例外が同じ名前のファイルによって引き起こされた場合、おそらくこれで問題が解決します。「ネットワーク名がわからない」という理由でユーザーが原因である場合、私にも手がかりがありません。

于 2013-01-09T14:23:59.970 に答える
3

私たちも同じことがありましたが、私たちの場合は、パーミッションの問題であることは明らかでした。文書化された UnauthorizedAccessException を期待していましたが、そうではありませんでした。

スタックには、Directory.InternalCreateDirectory を呼び出す Directory.CreateDirectory があります。

中にはこんな注意書きが。

        //Note that InternalExists may fail due 
        // to Win32 ACL's preventing us from seeing a directory, and this
        // isn't threadsafe. 

それについては、その事実をさらに深く掘り下げるメモがあります。コードは、ディレクトリが表示されないときに、既に存在するディレクトリを作成しようとする場合があります。

于 2013-05-13T13:00:03.057 に答える