パスがファイルかディレクトリかを確認するより良い方法は?


382

TreeViewディレクトリとファイルを処理しています。ユーザーは、ファイルまたはディレクトリのいずれかを選択して、それに対して何かを行うことができます。これには、ユーザーの選択に基づいてさまざまなアクションを実行するメソッドが必要です。

現時点では、パスがファイルかディレクトリかを判断するために次のようなことをしています。

bool bIsFile = false;
bool bIsDirectory = false;

try
{
    string[] subfolders = Directory.GetDirectories(strFilePath);

    bIsDirectory = true;
    bIsFile = false;
}
catch(System.IO.IOException)
{
    bIsFolder = false;
    bIsFile = true;
}

これを行うにはもっと良い方法があると感じざるを得ません!これを処理する標準の.NETメソッドを見つけたいと思っていましたが、それができませんでした。そのような方法は存在しますか?存在しない場合、パスがファイルかディレクトリかを判断する最も簡単な方法は何ですか?


8
質問のタイトルを編集して、「既存の」ファイル/ディレクトリを指定できますか?すべての回答は、ディスク上のファイル/ディレクトリのパスに適用されます。
ジェイクバーガー

1
@jbergerは以下の私の答えを参照してください。存在するかもしれないし存在しないかもしれないファイル/フォルダーのパスに対してこれを達成する方法を見つけました。
2012年

可能性のある.NETの
nawfal 2013年

このツリービューにどのように入力しますか?どのようにしてその道を切り開いていますか?
Random832 2013

回答:


596

以下からのパスがファイルまたはディレクトリである場合に見分ける方法

// get the file attributes for file or directory
FileAttributes attr = File.GetAttributes(@"c:\Temp");

//detect whether its a directory or file
if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
    MessageBox.Show("Its a directory");
else
    MessageBox.Show("Its a file");

.NET 4.0以降用のアップデート

以下のコメントに従って、.NET 4.0以降を使用している場合(および最大のパフォーマンスは重要ではない場合)、コードをより簡潔に記述できます。

// get the file attributes for file or directory
FileAttributes attr = File.GetAttributes(@"c:\Temp");

if (attr.HasFlag(FileAttributes.Directory))
    MessageBox.Show("Its a directory");
else
    MessageBox.Show("Its a file");

8
+1これはより良いアプローチであり、私が提案したソリューションよりも大幅に高速です。
Andrew Hare

6
@ KeyMs92そのビットごとの数学。基本的に、attrは「これはディレクトリです」を意味する1ビットのバイナリ値です。ビット&演算子と演算子は、両方のオペランドでオン(1)になっているビットのみがオンになっているバイナリ値を返します。この場合、ビット単位の操作を実行するattrと、そのFileAttributes.Directory値はFileAttributes.Directory、ディレクトリファイル属性ビットがオンになっている場合の値を返します。詳細については、en.wikipedia.org / wiki / Bitwise_operationを参照してください。
カイルトラウバーマン

6
@jbergerパスが存在しない場合、C:\Tempと呼ばれるディレクトリTempまたはと呼ばれるファイルを参照するかどうかはあいまいですTemp。コードは何をするつもりですか?
ta.speot.is

26
@キー:.NET 4.0以降でattr.HasFlag(FileAttributes.Directory)は、代わりに使用できます。
–ŞafakGür2013

13
@ŞafakGür:時間に敏感なループの中でこれを行わないでください。attr.HasFlag()は地獄のように低速であり、各呼び出しにReflectionを使用します
springy76

247

これらを使用するのはどうですか?

File.Exists();
Directory.Exists();

43
これには、とは異なり、無効なパスで例外をスローしないという利点もありFile.GetAttributes()ます。
Deanna

私はプロジェクトでBCLbcl.codeplex.com/…のロングパスライブラリを使用しているため、ファイル属性を取得する方法はありませんが、Existを呼び出すのは良い回避策です。
プテルドボラート

4
@jberger存在しないファイル/フォルダへのパスでは機能しないと思います。File.Exists( "c:\\ temp \\ nonexistant.txt")はfalseを返す必要があります。
michaelkoss

12
存在しないファイル/フォルダーが心配な場合は、これを試してください public static bool? IsDirectory(string path){ if (Directory.Exists(path)) return true; // is a directory else if (File.Exists(path)) return false; // is a file else return null; // is a nothing }
ダスティンタウンゼント


20

この行だけで、パスがディレクトリかファイルかを取得できます。

File.GetAttributes(data.Path).HasFlag(FileAttributes.Directory)

4
これには少なくとも.NET 4.0が必要です。また、これはパスが有効なパスでない場合に爆発します。
nawfal 2013年

FileInfoオブジェクトを使用して、パスが存在するかどうかを確認します。FileInfo pFinfo = new FileInfo(FList [0]); if(pFinfo.Exists){if(File.GetAttributes(FList [0])。HasFlag(FileAttributes.Directory)){}}。これは私のために働きます。
Michael Stimson、2016年

FileInfoオブジェクトを既に作成していて、インスタンスのExistsプロパティを使用している場合は、静的なFile.GetAttributes()メソッドを使用する代わりに、そのAttributesプロパティにアクセスしてみませんか?
dynamichael

10

これが私のものです:

    bool IsPathDirectory(string path)
    {
        if (path == null) throw new ArgumentNullException("path");
        path = path.Trim();

        if (Directory.Exists(path)) 
            return true;

        if (File.Exists(path)) 
            return false;

        // neither file nor directory exists. guess intention

        // if has trailing slash then it's a directory
        if (new[] {"\\", "/"}.Any(x => path.EndsWith(x)))
            return true; // ends with slash

        // if has extension then its a file; directory otherwise
        return string.IsNullOrWhiteSpace(Path.GetExtension(path));
    }

他の人の答えと似ていますが、まったく同じではありません。


3
技術的にはPath.DirectorySeparatorCharand を使用する必要がありますPath.AltDirectorySeparatorChar
drzaus '

1
意図を推測するこのアイデアは興味深いものです。私見は2つの方法に分ける方が良いです。方法1は存在テストを実行し、null許容ブール値を返します。呼び出し元がOneからのnull結果で「推測」部分を必要とする場合、推測を行うメソッドTwoを呼び出します。
ToolmakerSteve 2018

2
これを書き換えて、推測したかどうかにかかわらずタプルを返すようにします。
Ronnie Overby 2018

1
「拡張子がある場合はファイル」-これは真実ではありません。ファイルに拡張子を付ける必要はなく(Windowsでも)、ディレクトリには「拡張子」を付けることができます。たとえば、これはファイルまたはディレクトリにすることができます: "C:\ New folder.log"
bytedev

2
@bytedev私はそれを知っていますが、関数のその時点で、コードは意図を推測しています。そう言っているコメントさえあります。ほとんどのファイルには拡張子があります。ほとんどのディレクトリにはありません。
ロニーオーバーバイ2018

7

Directory.Exists()の代わりに、File.GetAttributes()メソッドを使用してファイルまたはディレクトリの属性を取得できるため、次のようなヘルパーメソッドを作成できます。

private static bool IsDirectory(string path)
{
    System.IO.FileAttributes fa = System.IO.File.GetAttributes(path);
    return (fa & FileAttributes.Directory) != 0;
}

アイテムの追加のメタデータを含むコントロールを設定するときに、TreeViewコントロールのタグプロパティにオブジェクトを追加することも検討できます。たとえば、ファイルのFileInfoオブジェクトとディレクトリのDirectoryInfoオブジェクトを追加し、タグプロパティで項目タイプをテストして、項目をクリックしたときにそのデータを取得するための追加のシステムコールを保存することができます。


2
これは他の回答
Jake Berger

6
その恐ろしい論理のブロックではなく、試してくださいisDirectory = (fa & FileAttributes.Directory) != 0);
イモータルブルー

5

これは、ExistsプロパティとAttributesプロパティの動作を考えると、思いついた最高の方法でした。

using System.IO;

public static class FileSystemInfoExtensions
{
    /// <summary>
    /// Checks whether a FileInfo or DirectoryInfo object is a directory, or intended to be a directory.
    /// </summary>
    /// <param name="fileSystemInfo"></param>
    /// <returns></returns>
    public static bool IsDirectory(this FileSystemInfo fileSystemInfo)
    {
        if (fileSystemInfo == null)
        {
            return false;
        }

        if ((int)fileSystemInfo.Attributes != -1)
        {
            // if attributes are initialized check the directory flag
            return fileSystemInfo.Attributes.HasFlag(FileAttributes.Directory);
        }

        // If we get here the file probably doesn't exist yet.  The best we can do is 
        // try to judge intent.  Because directories can have extensions and files
        // can lack them, we can't rely on filename.
        // 
        // We can reasonably assume that if the path doesn't exist yet and 
        // FileSystemInfo is a DirectoryInfo, a directory is intended.  FileInfo can 
        // make a directory, but it would be a bizarre code path.

        return fileSystemInfo is DirectoryInfo;
    }
}

テスト方法は次のとおりです。

    [TestMethod]
    public void IsDirectoryTest()
    {
        // non-existing file, FileAttributes not conclusive, rely on type of FileSystemInfo
        const string nonExistentFile = @"C:\TotallyFakeFile.exe";

        var nonExistentFileDirectoryInfo = new DirectoryInfo(nonExistentFile);
        Assert.IsTrue(nonExistentFileDirectoryInfo.IsDirectory());

        var nonExistentFileFileInfo = new FileInfo(nonExistentFile);
        Assert.IsFalse(nonExistentFileFileInfo.IsDirectory());

        // non-existing directory, FileAttributes not conclusive, rely on type of FileSystemInfo
        const string nonExistentDirectory = @"C:\FakeDirectory";

        var nonExistentDirectoryInfo = new DirectoryInfo(nonExistentDirectory);
        Assert.IsTrue(nonExistentDirectoryInfo.IsDirectory());

        var nonExistentFileInfo = new FileInfo(nonExistentDirectory);
        Assert.IsFalse(nonExistentFileInfo.IsDirectory());

        // Existing, rely on FileAttributes
        const string existingDirectory = @"C:\Windows";

        var existingDirectoryInfo = new DirectoryInfo(existingDirectory);
        Assert.IsTrue(existingDirectoryInfo.IsDirectory());

        var existingDirectoryFileInfo = new FileInfo(existingDirectory);
        Assert.IsTrue(existingDirectoryFileInfo.IsDirectory());

        // Existing, rely on FileAttributes
        const string existingFile = @"C:\Windows\notepad.exe";

        var existingFileDirectoryInfo = new DirectoryInfo(existingFile);
        Assert.IsFalse(existingFileDirectoryInfo.IsDirectory());

        var existingFileFileInfo = new FileInfo(existingFile);
        Assert.IsFalse(existingFileFileInfo.IsDirectory());
    }

5

他の回答からの提案を組み合わせた後、私はロニー・オーバービーの回答とほぼ同じことを思いついたことがわかりました。以下は、考慮すべき点を指摘するためのテストです。

  1. フォルダは「拡張子」を持つことができます: C:\Temp\folder_with.dot
  2. ファイルはディレクトリ区切り文字(スラッシュ)で終了できません
  3. 技術的には、プラットフォーム固有の2つのディレクトリセパレータがあります。つまり、スラッシュである場合とそうでない場合があります(Path.DirectorySeparatorCharおよびPath.AltDirectorySeparatorChar)。

テスト(Linqpad)

var paths = new[] {
    // exists
    @"C:\Temp\dir_test\folder_is_a_dir",
    @"C:\Temp\dir_test\is_a_dir_trailing_slash\",
    @"C:\Temp\dir_test\existing_folder_with.ext",
    @"C:\Temp\dir_test\file_thats_not_a_dir",
    @"C:\Temp\dir_test\notadir.txt",
    // doesn't exist
    @"C:\Temp\dir_test\dne_folder_is_a_dir",
    @"C:\Temp\dir_test\dne_folder_trailing_slash\",
    @"C:\Temp\dir_test\non_existing_folder_with.ext",
    @"C:\Temp\dir_test\dne_file_thats_not_a_dir",
    @"C:\Temp\dir_test\dne_notadir.txt",        
};

foreach(var path in paths) {
    IsFolder(path/*, false*/).Dump(path);
}

結果

C:\Temp\dir_test\folder_is_a_dir
  True 
C:\Temp\dir_test\is_a_dir_trailing_slash\
  True 
C:\Temp\dir_test\existing_folder_with.ext
  True 
C:\Temp\dir_test\file_thats_not_a_dir
  False 
C:\Temp\dir_test\notadir.txt
  False 
C:\Temp\dir_test\dne_folder_is_a_dir
  True 
C:\Temp\dir_test\dne_folder_trailing_slash\
  True 
C:\Temp\dir_test\non_existing_folder_with.ext
  False (this is the weird one)
C:\Temp\dir_test\dne_file_thats_not_a_dir
  True 
C:\Temp\dir_test\dne_notadir.txt
  False 

方法

/// <summary>
/// Whether the <paramref name="path"/> is a folder (existing or not); 
/// optionally assume that if it doesn't "look like" a file then it's a directory.
/// </summary>
/// <param name="path">Path to check</param>
/// <param name="assumeDneLookAlike">If the <paramref name="path"/> doesn't exist, does it at least look like a directory name?  As in, it doesn't look like a file.</param>
/// <returns><c>True</c> if a folder/directory, <c>false</c> if not.</returns>
public static bool IsFolder(string path, bool assumeDneLookAlike = true)
{
    // /programming/1395205/better-way-to-check-if-path-is-a-file-or-a-directory
    // turns out to be about the same as https://stackoverflow.com/a/19596821/1037948

    // check in order of verisimilitude

    // exists or ends with a directory separator -- files cannot end with directory separator, right?
    if (Directory.Exists(path)
        // use system values rather than assume slashes
        || path.EndsWith("" + Path.DirectorySeparatorChar)
        || path.EndsWith("" + Path.AltDirectorySeparatorChar))
        return true;

    // if we know for sure that it's an actual file...
    if (File.Exists(path))
        return false;

    // if it has an extension it should be a file, so vice versa
    // although technically directories can have extensions...
    if (!Path.HasExtension(path) && assumeDneLookAlike)
        return true;

    // only works for existing files, kinda redundant with `.Exists` above
    //if( File.GetAttributes(path).HasFlag(FileAttributes.Directory) ) ...; 

    // no idea -- could return an 'indeterminate' value (nullable bool)
    // or assume that if we don't know then it's not a folder
    return false;
}

Path.DirectorySeparatorChar.ToString()文字列連結の代わりに""
コーディング終了

@GoneCodingおそらく; 当時、私は一連のnull可能なプロパティを扱っていたため、nullのチェックについて心配するのではなく、「空の文字列で連結」する習慣をつけました。本当に最適化したい場合は、それがnew String(Path.DirectorySeparatorChar, 1)何をするのかを行うこともできToStringます。
drzaus

4

最も正確なアプローチは、shlwapi.dllの相互運用コードを使用することです

[DllImport(SHLWAPI, CharSet = CharSet.Unicode)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
[ResourceExposure(ResourceScope.None)]
internal static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);

次に、次のように呼び出します。

#region IsDirectory
/// <summary>
/// Verifies that a path is a valid directory.
/// </summary>
/// <param name="path">The path to verify.</param>
/// <returns><see langword="true"/> if the path is a valid directory; 
/// otherwise, <see langword="false"/>.</returns>
/// <exception cref="T:System.ArgumentNullException">
/// <para><paramref name="path"/> is <see langword="null"/>.</para>
/// </exception>
/// <exception cref="T:System.ArgumentException">
/// <para><paramref name="path"/> is <see cref="F:System.String.Empty">String.Empty</see>.</para>
/// </exception>
public static bool IsDirectory(string path)
{
    return PathIsDirectory(path);
}

31
醜い。これらの単純なタスクを実行するための相互運用性は嫌いです。そして、それはポータブルではありません。そしてそれは醜いです。醜いと言った?:)
Ignacio Soler Garcia

5
@SoMoSそれはあなたの意見では「醜い」かもしれませんが、それはまだ最も正確なアプローチです。はい、それはポータブルなソリューションではありませんが、それは質問が尋ねたものではありませんでした。
Scott Dorman、

8
正確とはどういう意味ですか?Quinn Wilsonからの回答と同じ結果が得られ、移植性を損なう相互運用が必要になります。私には、他のソリューションと同じくらい正確で、他のソリューションにはない副作用があります。
Ignacio Soler Garcia

7
これを行うためのフレームワークAPIがあります。Interopを使用することは、進むべき道ではありません。
TomXP411、2015

5
はい、これは機能しますが、「最も正確な」ソリューションではありません。既存の.NET Frameworkを使用する以外はありません。代わりに、6行のコードを使用して、1行で実行できることを.NET Frameworkで置き換えることができます。これをMonoプロジェクトに移植する機能を開いたままにするのではなく、Windowsのみを使用するようにロックします。.NET Frameworkがよりエレガントなソリューションを提供する場合は、Interopを使用しないでください。
ラス

2

使用するものは次のとおりです。

using System;

using System.IO;

namespace crmachine.CommonClasses
{

  public static class CRMPath
  {

    public static bool IsDirectory(string path)
    {
      if (path == null)
      {
        throw new ArgumentNullException("path");
      }

      string reason;
      if (!IsValidPathString(path, out reason))
      {
        throw new ArgumentException(reason);
      }

      if (!(Directory.Exists(path) || File.Exists(path)))
      {
        throw new InvalidOperationException(string.Format("Could not find a part of the path '{0}'",path));
      }

      return (new System.IO.FileInfo(path).Attributes & FileAttributes.Directory) == FileAttributes.Directory;
    } 

    public static bool IsValidPathString(string pathStringToTest, out string reasonForError)
    {
      reasonForError = "";
      if (string.IsNullOrWhiteSpace(pathStringToTest))
      {
        reasonForError = "Path is Null or Whitespace.";
        return false;
      }
      if (pathStringToTest.Length > CRMConst.MAXPATH) // MAXPATH == 260
      {
        reasonForError = "Length of path exceeds MAXPATH.";
        return false;
      }
      if (PathContainsInvalidCharacters(pathStringToTest))
      {
        reasonForError = "Path contains invalid path characters.";
        return false;
      }
      if (pathStringToTest == ":")
      {
        reasonForError = "Path consists of only a volume designator.";
        return false;
      }
      if (pathStringToTest[0] == ':')
      {
        reasonForError = "Path begins with a volume designator.";
        return false;
      }

      if (pathStringToTest.Contains(":") && pathStringToTest.IndexOf(':') != 1)
      {
        reasonForError = "Path contains a volume designator that is not part of a drive label.";
        return false;
      }
      return true;
    }

    public static bool PathContainsInvalidCharacters(string path)
    {
      if (path == null)
      {
        throw new ArgumentNullException("path");
      }

      bool containedInvalidCharacters = false;

      for (int i = 0; i < path.Length; i++)
      {
        int n = path[i];
        if (
            (n == 0x22) || // "
            (n == 0x3c) || // <
            (n == 0x3e) || // >
            (n == 0x7c) || // |
            (n  < 0x20)    // the control characters
          )
        {
          containedInvalidCharacters = true;
        }
      }

      return containedInvalidCharacters;
    }


    public static bool FilenameContainsInvalidCharacters(string filename)
    {
      if (filename == null)
      {
        throw new ArgumentNullException("filename");
      }

      bool containedInvalidCharacters = false;

      for (int i = 0; i < filename.Length; i++)
      {
        int n = filename[i];
        if (
            (n == 0x22) || // "
            (n == 0x3c) || // <
            (n == 0x3e) || // >
            (n == 0x7c) || // |
            (n == 0x3a) || // : 
            (n == 0x2a) || // * 
            (n == 0x3f) || // ? 
            (n == 0x5c) || // \ 
            (n == 0x2f) || // /
            (n  < 0x20)    // the control characters
          )
        {
          containedInvalidCharacters = true;
        }
      }

      return containedInvalidCharacters;
    }

  }

}

2

同様の問題に直面したときにこれに遭遇しましたが、ファイルまたはフォルダーが実際には存在しない可能性があるときに、ファイルまたはフォルダーのパスであるかどうかを確認する必要がありました。上記の回答には、このシナリオでは機能しないとのコメントがいくつかありました。私にはうまくいくように見える解決策を見つけました(私はVB.NETを使用していますが、必要に応じて変換できます)。

Dim path As String = "myFakeFolder\ThisDoesNotExist\"
Dim bIsFolder As Boolean = (IO.Path.GetExtension(path) = "")
'returns True

Dim path As String = "myFakeFolder\ThisDoesNotExist\File.jpg"
Dim bIsFolder As Boolean = (IO.Path.GetExtension(path) = "")
'returns False

うまくいけば、これは誰かに役立つかもしれません!


1
Path.HasExtensionメソッドを試しましたか?
Jake Berger

存在しない場合は、ファイルでもディレクトリでもありません。どちらの名前でも作成できます。あなたがそれを作成するつもりなら、あなたはあなたが何を作成しているのかを知っているべきであり、もしそうでなければ、なぜあなたはおそらくこの情報が必要なのでしょうか?
Random832 2013

8
フォルダーとファイルに名前を付けることできます-これらの場合、コードは誤った結果を返しますtest.txttest
Stephan Bauer

2
System.IO.FIleクラスとSystem.IO.Directoryクラスには.Existsメソッドがあります。それがやるべきことです。ディレクトリは拡張子を持つことができます。よく見ます。
TomXP411、2015

2

ゲームの後半は知っているが、とにかくこれを共有したいと思った。パスのみを文字列として扱う場合、これを理解するのは簡単です。

private bool IsFolder(string ThePath)
{
    string BS = Path.DirectorySeparatorChar.ToString();
    return Path.GetDirectoryName(ThePath) == ThePath.TrimEnd(BS.ToCharArray());
}

たとえば、次の ThePath == "C:\SomeFolder\File1.txt"ようになります。

return "C:\SomeFolder" == "C:\SomeFolder\File1.txt" (FALSE)

別の例: ThePath == "C:\SomeFolder\"最終的には次のようになります。

return "C:\SomeFolder" == "C:\SomeFolder" (TRUE)

そして、これは末尾のバックスラッシュなしでも機能します: ThePath == "C:\SomeFolder"最終的にこれになるでしょう:

return "C:\SomeFolder" == "C:\SomeFolder" (TRUE)

これは、パス自体でのみ機能し、パスと「物理ディスク」との関係では機能しないことに注意してください。パス/ファイルが存在するかどうかなどはわかりませんが、パスがフォルダかファイルかを教えてくれます...


2
動作しませんSystem.IO.FileSystemWatcherディレクトリが削除された場合は、送信するため、c:\my_directory拡張子以下のファイルをするときと同じである引数としてc:\my_directory削除されますが。
レイ・チェン

GetDirectoryName('C:\SomeFolder')が返される'C:\'ため、最後のケースは機能しません。これは、拡張子のないディレクトリとファイルを区別しません。
ルーシー、

ディレクトリパスに常に最後の「\」が含まれると誤って想定している。たとえば、Path.GetDirectoryName("C:\SomeFolder\SomeSubFolder")が返されC:\SomeFolderます。GetDirectoryNameが返すものの独自の例は、バックスラッシュで終わっていないパスを返すことを示していることに注意してください。これは、誰かがGetDirectoryNameを別の場所で使用してディレクトリパスを取得し、それをメソッドにフィードした場合、間違った回答を取得することを意味します。
ToolmakerSteve 2018

1

「非表示」および「システム」とマークされたディレクトリを含むディレクトリを検索する場合は、これを試してください(.NET V4が必要です):

FileAttributes fa = File.GetAttributes(path);
if(fa.HasFlag(FileAttributes.Directory)) 

1

私はこれが必要で、投稿が役に立ちました。これにより1行になり、パスがまったくパスでない場合は、メソッドに戻って終了します。上記のすべての問題に対処し、末尾のスラッシュも不要です。

if (!Directory.Exists(@"C:\folderName")) return;

0

私は以下を使用します。これは拡張機能もテストします。つまり、指定されたパスがファイルであるが、存在しないファイルであるかどうかをテストするために使用できます。

private static bool isDirectory(string path)
{
    bool result = true;
    System.IO.FileInfo fileTest = new System.IO.FileInfo(path);
    if (fileTest.Exists == true)
    {
        result = false;
    }
    else
    {
        if (fileTest.Extension != "")
        {
            result = false;
        }
    }
    return result;
}

1
FileInfo Extensionは(IMAO)存在しないパスをチェックするのに適したオプションです
dataCore

2
あなたの2番目の状態(その他)は臭いです。それが既存のファイルでない場合は、それが何であるかがわかりません(ディレクトリも「.txt」などで終わる可能性があります)。
nawfal 2013年

0
using System;
using System.IO;
namespace FileOrDirectory
{
     class Program
     {
          public static string FileOrDirectory(string path)
          {
               if (File.Exists(path))
                    return "File";
               if (Directory.Exists(path))
                    return "Directory";
               return "Path Not Exists";
          }
          static void Main()
          {
               Console.WriteLine("Enter The Path:");
               string path = Console.ReadLine();
               Console.WriteLine(FileOrDirectory(path));
          }
     }
}

0

この投稿で選択した回答を使用して、コメントを確認し、@ŞafakGür、@ Anthony、@ Quinn Wilsonに、私が書いてテストしたこの改善された回答につながる情報ビットを提供しました。

    /// <summary>
    /// Returns true if the path is a dir, false if it's a file and null if it's neither or doesn't exist.
    /// </summary>
    /// <param name="path"></param>
    /// <returns></returns>
    public static bool? IsDirFile(this string path)
    {
        bool? result = null;

        if(Directory.Exists(path) || File.Exists(path))
        {
            // get the file attributes for file or directory
            var fileAttr = File.GetAttributes(path);

            if (fileAttr.HasFlag(FileAttributes.Directory))
                result = true;
            else
                result = false;
        }

        return result;
    }

Directory / File Exists()をすでに確認した後で、属性を確認するのは少し無駄に思われますか?これらの2つの呼び出しだけで、ここで必要なすべての作業が行われます。
コーディング終了

0

たぶんUWP C#

public static async Task<IStorageItem> AsIStorageItemAsync(this string iStorageItemPath)
    {
        if (string.IsNullOrEmpty(iStorageItemPath)) return null;
        IStorageItem storageItem = null;
        try
        {
            storageItem = await StorageFolder.GetFolderFromPathAsync(iStorageItemPath);
            if (storageItem != null) return storageItem;
        } catch { }
        try
        {
            storageItem = await StorageFile.GetFileFromPathAsync(iStorageItemPath);
            if (storageItem != null) return storageItem;
        } catch { }
        return storageItem;
    }

0

なるほど、パーティーには10年遅すぎます。私は、いくつかのプロパティからファイル名または完全なファイルパスを受け取ることができる状況に直面していました。パスが指定されていない場合は、別のプロパティで指定された「グローバル」ディレクトリパスを添付して、ファイルの存在を確認する必要があります。

私の場合

var isFileName = System.IO.Path.GetFileName (str) == str;

トリックをしました。わかりました、それは魔法ではありませんが、おそらくこれは誰かを理解するのに数分を節約できるでしょう。これは単なる文字列解析なので、ドットの付いたDir-nameは誤検知を起こす可能性があります...


0

ここのパーティーには非常に遅れていますが、Nullable<Boolean>戻り値がかなり醜いことがわかりました- IsDirectory(string path)戻るnullは、詳細なコメントなしに存在しないパスと同等ではないので、次のことを思いつきました。

public static class PathHelper
{
    /// <summary>
    /// Determines whether the given path refers to an existing file or directory on disk.
    /// </summary>
    /// <param name="path">The path to test.</param>
    /// <param name="isDirectory">When this method returns, contains true if the path was found to be an existing directory, false in all other scenarios.</param>
    /// <returns>true if the path exists; otherwise, false.</returns>
    /// <exception cref="ArgumentNullException">If <paramref name="path"/> is null.</exception>
    /// <exception cref="ArgumentException">If <paramref name="path"/> equals <see cref="string.Empty"/></exception>
    public static bool PathExists(string path, out bool isDirectory)
    {
        if (path == null) throw new ArgumentNullException(nameof(path));
        if (path == string.Empty) throw new ArgumentException("Value cannot be empty.", nameof(path));

        isDirectory = Directory.Exists(path);

        return isDirectory || File.Exists(path);
    }
}

このヘルパーメソッドは、最初に読んだときに意図を理解するのに十分なほど簡潔かつ簡潔になるように記述されています。

/// <summary>
/// Example usage of <see cref="PathExists(string, out bool)"/>
/// </summary>
public static void Usage()
{
    const string path = @"C:\dev";

    if (!PathHelper.PathExists(path, out var isDirectory))
        return;

    if (isDirectory)
    {
        // Do something with your directory
    }
    else
    {
        // Do something with your file
    }
}

-4

これはうまくいきませんか?

var isFile = Regex.IsMatch(path, @"\w{1,}\.\w{1,}$");

1
フォルダ名にピリオドを
含める

また、ファイルにピリオドを含める必要はありません。
キースピンソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.