创建一个文件夹并验证路径是否正常

时间:2014-11-30 06:59:24

标签: vb.net

我想在我的VB .NET应用程序中创建一个文件夹,但我无法验证路径是否正确。例如,如果我输入

My.Computer.FileSystem.CreateDirectory("lol it will work")

它有效...虽然它看起来根本不像文件夹路径...如何验证输入的路径是否正确?并且由于它不会抛出任何异常,因此必须在某处创建文件夹,但在哪里?我找不到......

谢谢

1 个答案:

答案 0 :(得分:2)

您的目录名称“大声笑它将起作用” 有效名称。

当您不提供显式路径时,My.Computer.FileSystem.CreateDirectory()(以及其他一些方法/函数)将假设您提供的字符串是 相对路径 是应用程序的当前目录。

因此,无论您是传递完整路径(看起来像是有效的文件夹路径)还是部分路径/文件夹名称都无关紧要与应用程序的目录相关联,只要:

  • 已解决路径是有效路径(不包含无效字符或缺少文件夹名称分隔符)
  • 您(您的应用程序)可以访问该路径
  • 生成的路径不超过允许的最大字符数。
  • 您没有遇到某些特定的例外情况......

那么,您如何知道您的应用程序当前的工作路径?

由于您使用了My.Application.FileSystem:

My.Computer.FileSystem.CurrentDirectory ' Read/Write Property As String

您可以使用System.IO:

System.IO.Directory.GetCurrentDirectory() ' Get a String
System.IO.Directory.SetCurrentDirectory(NewPath) ' Set

您也可以使用System.Environment.Directory

Environment.CurrentDirectory ' Read/Write Property As String

三者(My.Computer.FileSystem,System.IO.Directory和Environment)都是可写的,如果您在应用程序中提供相对路径,则返回要解析的当前目录。


  

所以,回答你的问题:“如何验证输入的路径是否正确?”

如果您刚刚创建了目录并且没有异常,那么您的(相对)目录的名称是有效的,并且已创建目录:

My.Computer.FileSystem.CreateDirectory("lol it will work")
' Verification :
If System.IO.Directory.Exists("lol it will work") Then
    MessageBox.Show("The Directory has been created !")
Else
    MessageBox.Show("The Directory has'n been created !")
End If
' Shows "The Directory has been created !"

所以你知道,即使其他函数/方法也可以通过回退到应用程序的已定义的相对工作路径来解析相对路径(不是全部)。

以上测试与以下相同:

System.IO.Directory.Exists( _
    Path.Combine(Environment.CurrentDirectory, "lol it will work"))

  

注意:

     

由于这些对象的可写性,您的应用程序    可以 随时更改当前目录

考虑一下:

  • 使用替代对象/变量来获取您的工作目录或类似的
  • 仅使用显式路径
  • 使用在启动时存储CurrentDirectory的全局/静态变量(可能非常容易失败)
  • 每当你更改它时恢复CurrentDirectory(虽然 一次使用或者另一个在没有警告的情况下更改CurrentDirectory的对象 - 请阅读该文档每当涉及目录操作时对象;例如OpenFileDialog在XP和Win7 / 8上有不同的行为) - 这个移动是最不推荐的。

替代:

<强> AppDomain.CurrentDomain

AppDomain.CurrentDomain.BaseDirectory

这是一个ReadOnly属性。它返回加载程序集(应用程序)的目录的路径。 警告!此路径的结尾为"\",如:

G:\Tools\...\Sources\bin\Debug\   ' <- !!!

<强> Assembly.GetExecutingAssembly()。位置

System.IO.Directory.GetParent(Assembly.GetExecutingAssembly().Location)

这也将返回加载程序集的目录的路径,但由于使用了"\"而没有尾随GetParent()

使用Assembly检索路径非常有用,当您处理依赖项时,并非所有程序集都从同一目录加载。使用相对路径的代码应该使用此方法而不是经典方法。


我假设同样适用于Thread Domain,如果你想深入了解多线程(虽然我不确定这个假设的相关方面 - 从未使用过这个!):

Thread.GetDomain().BaseDirectory ' ReadOnly

好老Application.StartupPath

Application.StartupPath ' ReadOnly

...也有一个尾随"\"。在应用程序实际启动之前,您无法访问StartupPath!但是,当你从你的应用程序启动另一个进程并通过另一个进程使用它时,我从来没有检查它是否运行正常...(如果它可能......只是想象)

相关问题