0

過去にいくつかの同様の質問があったことを知っています。また、API呼び出しを使用してファイルシステムを使用Directory.Exists()またはFile.Exists()チェックできることも知っていますが、入力文字列に基づいてこの決定を下そうとしています。

public bool ValidateOutputFilename ( string sPath )
{
    // check if sPath is actually a filename
}

私の推測では、フォルダ名のように見えるもの(拡張子はないが末尾はない\)が実際にはファイルである可能性があるため(たとえばC:\A\B\C、ファイルまたはフォルダを表す場合、またはその逆の場合)、それは不可能だと思います。

ファイルシステムのチェックを避けたい理由は、パスが存在する場合と存在しない場合がありsPath、ネットワークの場所を表す場合があるためです。この場合、ファイルシステムのクエリは遅くなります。

まだ考えていないアイデアを誰かに勧めてもらえるといいなと思っています。

4

2 に答える 2

2

ファイルシステムコールは避けられないと思います。
ファイルシステムだけが確実に知っています。
あなたが言ったように、単純で、よくフォーマットされた文字列は、パスまたはファイルとして識別できません。

質問に答える方法は、File.GetAttributesメソッドを使用することです。これは、ビット単位のANDでテストできるFileAttributes
列挙値を 返し、 Directoryビットが設定されているかどうかを確認し、(直接のアンマネージ呼び出しを除いて)最速のメソッドです。

try
{
    // get the file attributes for file or directory 
    FileAttributes attr = File.GetAttributes(sPath);
    bool isDir = ((attr & FileAttributes.Directory) == FileAttributes.Directory) ? true : false;
    if (isDir == false)
       ....
    else
       ....
    }
}
catch(Exception ex)
{
    // here as an example. probably you should handle this in the calling code
    MessageBox.Show("GetAttributes", ex.Message);
}

もちろん、パスで表されるファイルまたはディレクトリが存在しない場合は、処理する必要のある例外が発生します。

補足として:Directory.ExistsまたはFile.Existsは、指定された名前のファイルまたはディレクトリが存在するかどうかを教えてくれますが、パス文字列が何を表しているのかわからない場合、どのように正しいものを呼び出すのですか?確実に両方に電話する必要があります。

于 2012-10-06T12:20:44.323 に答える
1

物理的に読み取らない限り、ファイルに関する詳細情報を取得する方法はありません。私が理解していることから、あなたはファイルを読まないようにしたいと思います。

文字列に含まれる拡張子と末尾のスラッシュを確認する以外に選択肢はありません。しかし、そのようでも、結果は決して現実的ではありません。たとえば、dにこのフォルダを作成しました。

D:\Music\file.txt

そして私はこのファイルを中に作成しました:

D:\Music\file.txt\folder
于 2012-10-06T12:31:33.630 に答える