>我正在用 C# 测试软件,必须确保在为程序提供无效的完整路径时发生正确的行为(正常失败(。最初这是微不足道的,因为我给出了类似"Q:\fakepath"
的东西,并且由于系统上没有安装Q
驱动器,因此程序按预期失败。
但是,我希望我的测试是健壮的,并且想要一种方法来生成一条保证不存在和无法存在的路径。路径必须已满,因为如果它不以驱动器号开头,它将相对于某个目录进行处理,从而不会失败。
我有一些方法是搜索已安装的本地驱动器,然后选择未出现的驱动器号。这将正常工作,我最终可能会使用它,但我更喜欢更优雅的解决方案,例如使用可能不存在的驱动器号。
另一个(可能的(选项是在路径名中使用无效字符。但是,使用无效字符不是首选,因为它实际上会导致程序的不同失败模式。
所以正式地:我怎样才能最优雅地生成一个保证不会无效的完整路径?
编辑:我正在测试的程序将继续创建一个目录(包括父目录(,如果它位于有效的驱动器上,但在尚不存在的位置。因此,这条路径需要是无法用Directory.CreateDirectory(<path>)
这样的东西创建的东西,而不仅仅是不存在的东西。
一种方法是使用Windows API创建一个临时文件夹。这听起来可能违反直觉,但现在您有一个已知的空文件夹,您在其中指定的任何路径都保证不存在。例如:
//From https://stackoverflow.com/a/278457/1663001:
public string GetTemporaryDirectory()
{
string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
Directory.CreateDirectory(tempDirectory);
return tempDirectory;
}
public string GetNonexistantPath()
{
return Path.Combine(GetTemporaryDirectory(), "no-such-file");
}
获取保证无效文件夹路径的一种方法是拥有一个与目录路径的一部分同名的文件。
public string Example()
{
string filePath = Path.GetTempFileName(); //Creates a uniquely named, zero-byte temporary file on disk.
var invalidDirectoryPath = Path.Combine(filePath, "CanNotExist");
Directory.CreateDirectory(invalidDirectoryPath); //throws a IOException
}
您可以尝试使用其中一个保留字,例如C:NUL
(区分大小写(。尝试创建此类目录将导致DirectoryNotFoundException
。更多细节在这里。
你可以使用一些很长的路径(比如一千个字符(。您的程序可能无法创建它,因为它是无效的。
您可以尝试此方法。不确定它是否有效,但值得一试。
use path: Q:\asddsafkdjfkasjdfklahsjfhskdjfladjfhsafjklasdjfkashfkajsdfhasdklfjashdfkljasdhfklajdfajsdfklajsfkjasjfhadkfjasflhakldfjashdfklajsdjfhaksldjfahsdkljadfklajfkjlkajfkljagklfdjklfdjklajdkfljgskljgklfjskgjfkljskgjfkljdsgfsdgsdfgsfgsdfgsfgsdfgsfgsdfgdgfgsdghijklmskgfkfgsdfkljfgsdfkljfgsdfkfgsdfgkfgsdfgsdfgsdfg
不要费心计算字母总数,您可以使用 http://www.lettercount.com/
诀窍是Windows文件夹的最大长度可以是260。 虽然我在 Windows 10 上尝试过,但我允许的最大长度是 247。 Source_MAX_Length_Of_Folder_On_Windows
因此,保证永远不会找到此文件夹。干杯:)
虽然,我认为最优雅的解决方案是检查已安装的驱动器并在之后生成您已经提到的路径,并决定将其保留为最后的选择。