"Best"访问 IO 的方法。文件信息受保护的属性(原始路径)?



我正在研究一系列方法,这些方法将测试给定路径以确定它是否(或至少可能(有效。我有几个重载可以接受IO.FileInfo对象或IO.DirectoryInfo对象 - 我个人更喜欢使用它来帮助在此过程中尽快捕获无效字符。作为流程的一部分,我"需要"获得的一条信息基本上是用户呈现的原始值 -特别是在IO.FileInfoIO.DirectoryInfo对象的情况下,因为它们会自动将Environment.CurrentDirectory值附加到它确定为相对路径的任何字符串。

例如:

Dim TestFile As New IO.FileInfo("TestingThis is a test")

使用以下属性(以及其他属性(实例化IO.FileInfo对象:

  • DirectoryName-"C:DevelopmentMy SolutionMy ProjectbinDebugTesting"
  • Exists-False
  • Extension-""
  • FullName-"C:DevelopmentMy SolutionMy ProjectbinDebugTestingThis is a test"
  • Name-"This is a test"
  • OriginalPath-"TestingThis is a test"

最后一个属性是我最感兴趣的属性。它是IO.FileInfo类的Protected属性,继承自IO.FileSystemInfo类,但它似乎是检索传递给IO.FileInfo构造函数的原始值的最佳方法。显然,我不能用一个简单的Dim TestPath As String = TestFile.OriginalPath直接访问该属性 - IDE 显示错误">'System.IO.FileSystemInfo.OriginalPath' is not accessible in this context because it is 'Protected'" - 所以我只能想到一种方法来获取这条特定信息:创建一个全新的类,该类继承IO.FileSystemInfoPublic属性用于从基类读取的OriginalPath

请注意:我确实有一个接受String值的重载方法,但我实际上正在考虑尝试将该方法"隐藏"在Private修饰符后面,以便只有FileInfoDirectoryInfo对象可用于调用此方法。我的主要理由是,如果FileInfoDirectoryInfo对象由于字符串中的无效字符(或任何其他原因(而无法实例化,我没有理由调用此方法,我可能能够"清理"代码一点。

无论如何,创建一个完全独立的类,实际上只用于在这个特定场景中访问这一个属性,对于应该(或者至少可以(相当简单的事情来说,这似乎是非常多的开销。不幸的是,我想不出任何其他方法来提取这些信息,我只是想知道我是否可能想多了。

与此同时,我继续创建了一个用于测试的TempFileInfo类(注意:我还没有实际测试过它(,而没有为任何常规Public属性显式实现任何"自定义"代码(从IO.FileSystemInfo类继承时需要(:

Private Class TempFileInfo
Inherits IO.FileSystemInfo
Public Overrides ReadOnly Property Name As String
Get
Throw New NotImplementedException()
End Get
End Property
Public Overrides ReadOnly Property Exists As Boolean
Get
Throw New NotImplementedException()
End Get
End Property
Public Overrides Sub Delete()
Throw New NotImplementedException()
End Sub
Public Shadows ReadOnly Property OriginalPath As String
Get
Return MyBase.OriginalPath
End Get
End Property
Public Shared Widening Operator CType(v As FileInfo) As TempFileInfo
Dim FSI As FileSystemInfo = v
Return CType(FSI, TempFileInfo)
End Operator
End Class

您会注意到,我还包含一个Widening Operator,它应该允许我从"常规"IO.FileInfo对象转换为我的TempFileInfo对象,以便我可以访问我的"自定义"OriginalPath属性。这是到目前为止我找到的"从这里到达那里"的唯一方法,但我想继续在这里询问,以防有其他建议或我可能忽略的事情。

这种实现方法的唯一"节省恩典"是,因为"自定义"TempFileInfo、标准IO.FileInfo和标准IO.DirectoryInfo类都继承自IO.FileSystemInfo类,我应该能够简单地创建一个重载的Widening Operator方法来转换IO.FileInfo对象和IO.DirectoryInfo对象,而不必创建单独的TempDirInfo类。

创建 FileInfo 或 DirectoryInfo 对象时输入的路径存储在protected String OriginalPath字段中(用于序列化目的(和内部 DisplayPath 属性(用作内部引用(。

初始化类对象时(请参阅 .Net 源代码中的 Init(( 方法(,输入的路径存储在OriginalPath字段和DisplayPath属性中。

这两个类都不提供公共属性来检索用于创建对象的初始路径。
相反,它们都返回DisplayPath属性值作为对 ToString(( 方法的重写:

Dim fInfo = New FileInfo("SomePathSomeFileName.ext")
Dim originalPath = fInfo.ToString()

var fInfo = new FileInfo(@"SomePathSomeFileName.ext");
string originalPath = fInfo.ToString();

最新更新