检查路径是文件还是目录的更好方法?
我正在处理目录和文件的 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 方法来处理这个问题,但我一直未能做到。是否存在这样的方法,如果不存在,确定路径是文件还是目录的最直接方法是什么?
I am processing a TreeView
of directories and files. A user can select either a file or a directory and then do something with it. This requires me to have a method which performs different actions based on the user's selection.
At the moment I am doing something like this to determine whether the path is a file or a directory:
bool bIsFile = false;
bool bIsDirectory = false;
try
{
string[] subfolders = Directory.GetDirectories(strFilePath);
bIsDirectory = true;
bIsFile = false;
}
catch(System.IO.IOException)
{
bIsFolder = false;
bIsFile = true;
}
I cannot help to feel that there is a better way to do this! I was hoping to find a standard .NET method to handle this, but I haven't been able to do so. Does such a method exist, and if not, what is the most straightforward means to determine whether a path is a file or directory?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(23)
来自 如何判断路径是文件还是目录:
针对 .NET 4.0+ 的更新
根据下面的评论,如果您使用的是 .NET 4.0 或更高版本(并且最大性能并不重要),您可以以更简洁的方式编写代码:
From How to tell if path is file or directory:
Update for .NET 4.0+
Per the comments below, if you are on .NET 4.0 or later (and maximum performance is not critical) you can write the code in a cleaner way:
用这个怎么样?
如果它不是文件,即使目录确实存在,File.Exists() 也会返回 false,所以如果它返回 true,我们就知道我们得到了一个文件,如果它返回 false,我们要么有一个目录,要么有一个无效路径,所以接下来我们使用 Directory.Exists() 测试它是否是有效目录,如果返回 true,则我们有一个目录,如果不是,则它是无效路径。
How about using this?
File.Exists() will return false if it's not a file even if the directory does exist, so if it returns true, we know we got a file, if it returns false, we either have a directory or an invalid path so next we test if it's a valid directory with Directory.Exists() if that returns true, we have a directory if not it's an invalid path.
仅使用这一行,您就可以知道路径是目录还是文件:
With only this line you can get if a path is a directory or a file:
这是我的:
与其他人的答案类似,但不完全相同。
Here's mine:
It's similar to others' answers but not exactly the same.
作为 Directory.Exists() 的替代方法,您可以使用 File.GetAttributes() 方法来获取文件或目录的属性,因此您可以创建如下所示的帮助器方法:
您还可以考虑将对象添加到填充包含项目附加元数据的控件时,TreeView 控件的 tag 属性。例如,您可以为文件添加 FileInfo 对象,为目录添加 DirectoryInfo 对象,然后测试标记属性中的项目类型,以便在单击项目时无需进行额外的系统调用来获取该数据。
As an alternative to Directory.Exists(), you can use the File.GetAttributes() method to get the attributes of a file or a directory, so you could create a helper method like this:
You could also consider adding an object to the tag property of the TreeView control when populating the control that contains additional metadata for the item. For instance, you could add a FileInfo object for files and a DirectoryInfo object for directories and then test for the item type in the tag property to save making additional system calls to get that data when clicking on the item.
结合其他答案的建议后,我意识到我想出了与 Ronnie Overby 的答案 相同的内容。以下是一些测试,指出了一些需要考虑的事情:
C:\Temp\folder_with.dot
Path.DirectorySeparatorChar
和Path.AltDirectorySeparatorChar
)测试 (Linqpad)
结果
方法
After combining the suggestions from the other answers, I realized I came up with about the same thing as Ronnie Overby's answer. Here are some tests to point out some things to think about:
C:\Temp\folder_with.dot
Path.DirectorySeparatorChar
andPath.AltDirectorySeparatorChar
)Tests (Linqpad)
Results
Method
考虑到 Exists 和 Attributes 属性的行为,这是我能想到的最好的方法:
以下是它的测试方式:
This was the best I could come up with given the behavior of the Exists and Attributes properties:
Here's how it tests out:
检查路径文件名是否为空字符串,或者目录是否存在。这样,您就不会出现文件属性错误,同时仍然为可能的存在故障提供冗余。
Checks if the path file name is an empty string, or if the directory exists. This way you won't have the file attributes error while still providing redundancies for a possible exists failure.
这是我们使用的:
Here's what we use:
最准确的方法是使用 shlwapi.dll 中的一些互操作代码,
然后您可以这样调用它:
The most accurate approach is going to be using some interop code from the shlwapi.dll
You would then call it like this:
我在面临类似的问题时遇到了这个问题,除了我需要检查路径是否是文件或文件夹的当该文件或文件夹实际上可能不存在时。对上面的答案有一些评论提到它们不适用于这种情况。我找到了一个似乎对我来说很有效的解决方案(我使用 VB.NET,但如果需要,您可以进行转换):
希望这对某人有帮助!
I came across this when facing a similar problem, except I needed to check if a path is for a file or folder when that file or folder may not actually exist. There were a few comments on answers above that mentioned they would not work for this scenario. I found a solution (I use VB.NET, but you can convert if you need) that seems to work well for me:
Hopefully this can be helpful to someone!
如果您想查找目录,包括标记为“隐藏”和“系统”的目录,请尝试以下操作(需要 .NET V4):
If you want to find directories, including those that are marked "hidden" and "system", try this (requires .NET V4):
我需要这个,帖子有帮助,这可以将其缩减为一行,如果路径根本不是路径,它只是返回并退出该方法。它解决了上述所有问题,也不需要尾部斜杠。
I needed this, the posts helped, this gets it down to one line, and if the path isn't a path at all, it just returns and exits the method. It addresses all of the above concerns, doesn't need the trailing slash either.
我明白了,我参加聚会已经晚了 10 年。
我面临着这种情况,从某些属性我可以接收文件名或完整文件路径。如果没有提供路径,我必须通过附加另一个属性提供的“全局”目录路径来检查文件是否存在。
就我而言
,成功了。
好吧,这不是魔法,但这也许可以节省一些人几分钟的时间来弄清楚。
由于这只是一个字符串解析,因此带有点的目录名称可能会给出误报......
I see, I'm 10 years too late to the party.
I was facing the situation, where from some property I can receive either a file name or a full file path. If there is no path provided, I have to check the file-existence by attaching a "global" directory-path provided by another property.
In my case
did the trick.
Ok, it's not magic, but perhaps this could save someone a few minutes of figuring out.
Since this is merely a string-parsing, so Dir-names with dots may give false positives...
如果您仅将路径作为字符串使用,那么弄清楚这一点很容易:
例如:
ThePath == "C:\SomeFolder\File1.txt"
最终将是这样的:另一个例子:
ThePath == "C:\SomeFolder\"
最终会是这样: 如果没有尾随反斜杠,这也可以工作:
ThePath == "C:\SomeFolder"
最终会是这样的:请记住,这仅适用于路径本身,而不适用于路径和物理磁盘之间的关系,因此它无法告诉您路径/文件是否存在或类似的信息,但它Sure 可以告诉您路径是文件夹还是文件。
If you are solely working with the paths as strings, figuring this out is easy as pie:
For example:
ThePath == "C:\SomeFolder\File1.txt"
would end up being this:Another example:
ThePath == "C:\SomeFolder\"
would end up being this:And this would also work without the trailing backslash:
ThePath == "C:\SomeFolder"
would end up being this:Keep in mind here that this only works with the paths themselves, and not the relationship between the path and the physical disk so it can't tell you if the path/file exists or anything like that, but it sure can tell you if the path is a folder or a file.
我使用以下内容,它还测试扩展名,这意味着它可以用于测试提供的路径是否是文件但文件不存在。
I use the following, it also tests the extension which means it can be used for testing if the path supplied is a file but a file that doesn't exist.
使用这篇文章中选定的答案,我查看了评论并相信
@ŞafakGür、@Anthony 和 @Quinn Wilson 他们的信息位引导我找到了我编写和测试的改进答案:
Using the selected answer on this post, I looked at the comments and give credence to
@ŞafakGür, @Anthony and @Quinn Wilson for their info bits that lead me to this improved answer which I wrote and tested:
也许适用于 UWP C#
Maybe for UWP C#
参加聚会已经很晚了,但我发现
Nullable
返回值非常难看 -IsDirectory(string path)
返回null
并不等同于没有详细注释的不存在路径,因此我提出了以下建议:此帮助器方法编写得足够详细且简洁,足以在您第一次阅读它时理解其意图。
Very late to the party here but I've found the
Nullable<Boolean>
return value to be quite ugly -IsDirectory(string path)
returningnull
doesn't equate to a non-existent path without verbose commenting, so I've come up with the following:This helper method is written to be verbose and concise enough to understand the intent the first time you read it.
只需添加一个附带的案例 - “文件夹选择”。在路径中
在我的应用程序中,我得到了传递给我的最近打开的路径,其中一些具有“文件夹选择”。在最后。
某些 FileOpenDialogs 和 WinMerge 添加“文件夹选择”。到路径(这是真的)。
但在 Windows 操作系统“文件夹选择”下。不是建议的文件或文件夹名称(如永远不要这样做 - 握手)。
正如这里所说:http://msdn.microsoft。 com/en-us/library/aa365247%28VS.85%29.aspx
因此,同时“选择文件夹”。 不应该使用,它可以使用。 (惊人的)。
足够的解释 - 我的代码(我非常喜欢枚举):
Just adding a fringe case - "Folder Selection." in path
In my app I get recently opened paths passed to me, some of which have "Folder Selection." at the end.
Some FileOpenDialogs and WinMerge add "Folder Selection." to paths (it's true).
But under Windows OS "Folder Selection." is not an advised file or folder name (as in don't do it, ever - shakes fist).
As said here: http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx
So whilst "Folder Selection." shouldn't be used, it can be. (awesome).
Enough explanation - my code (I like enums a lot):
这是我的解决方案,请注意,我正在寻找一个完全避免任何不必要的文件系统访问的函数,但这里只允许进行字符串操作(路径可能不存在):
This is my solution, beware that i was looking for a function that strictly avoid any unnecessary file system access at all, but only string manipulations are allowed here (paths may not exist):
这不行吗?
Wouldn't this work?