我有一个静态类,我保留了大量在我的应用程序中的不同位置使用的相对路径。它看起来像是:
static class FilePathConstants
{
public const string FirstDirectory = "First";
public const string FirstSecondDirectory = "First/Second";
public const string FirstSecondThirdFileA = "First/Second/Third/FileA";
public const string FirstSecondFourthFileB = "First/Second/Fourth/FileB";
... nearly 100 of similar members
}
所有这些都是相对于某个父目录,我只知道在程序运行期间的位置。我需要将它们放在一起,因为它允许我轻松控制应用程序使用的文件并不时更改它们的位置。
然而,即使它们按字母顺序组织并且很容易找到某个路径,我也需要能够根据某些设置更改其中一些路径。可以说,有一个设置'bool SettingA',当我打开它时,我必须修改一些路径以使用不同的目录或不同的文件名。
问题是现在我不能使用常量,我必须将我的代码重写为属性或方法,以便我可以在运行时更改文件路径。在这里,我的代码变得更大,严格的顺序现在看起来很难看。有没有办法将它们分组,这样就不会混淆任何使用此代码的人?我无法将它们分成一个单独的类,因为很难记住在什么类中你可以保持什么常数。现在我按区域对它们进行分组,但我觉得在一个类中保留一百多个属性是错误的。
修改
我在FilePathConstants
中声明的所有目录和文件都在应用程序中的大量位置使用(每个路径可以多次使用,考虑到有超过一百个路径的事实 - 这是一个很大的数字)。我想保持这个类的接口相同或对使用它们的其他类进行最小的更改。
答案 0 :(得分:1)
也许你可以使用rowstructs
答案 1 :(得分:1)
使用" index"用于存储目录路径并在运行时加载它的文件。
const string indexFilePath = @"C:\dirlist.txt";
IEnumerable<string> paths = File.ReadAllLines(indexFilePath);
<强>更新强>
我想建议使用间接 - &#34; mapper&#34;类。 这是它应该是什么样子。
public enum FileSystemElement
{
FirstDirectory,
FirstSecondDirectory,
FirstSecondThirdFileA,
FirstSecondFourthFileB
}
public class FileSystemMapper
{
private readonly string _rootDirectory;
private readonly Dictionary<FileSystemElement, string> _fileElements;
public FileSystemMapper(string rootDirectory, string fileName)
{
_rootDirectory = rootDirectory;
string[] lines = File.ReadAllLines(fileName);
_fileElements = lines.Select(ParsePair).ToDictionary(pair => pair.Key, pair => pair.Value);
}
public string GetPath(FileSystemElement element)
{
string relativePath;
if (!_fileElements.TryGetValue(element, out relativePath))
{
throw new InvalidOperationException("Element not found");
}
string resultPath = Path.Combine(_rootDirectory, relativePath);
return resultPath;
}
private static KeyValuePair<FileSystemElement, string> ParsePair(string line)
{
const string separator = "|";
// File element alias | Path
if (string.IsNullOrEmpty(line))
throw new ArgumentException("Null or empty line", "line");
string[] components = line.Split(new[] { separator }, StringSplitOptions.RemoveEmptyEntries);
if (components.Length != 2)
throw new ArgumentException("Line has invalid format", "line");
FileSystemElement element;
bool parseResult = FileSystemElement.TryParse(components[0], out element);
if (!parseResult)
throw new ArgumentException("Invalid element name", "line");
string path = components[1]; // for clarity
return new KeyValuePair<FileSystemElement, string>(element, path);
}
客户端示例:
FileSystemMapper fileSystemMapper = new FileSystemMapper(@"C:\root", @"C:\dirs.txt");
string firstDirectory = fileSystemMapper.GetPath(FileSystemElement.FirstDirectory);
string secondDirectory = fileSystemMapper.GetPath(FileSystemElement.FirstSecondDirectory);
string secondThirdFile = fileSystemMapper.GetPath(FileSystemElement.FirstSecondThirdFileA);
索引文件格式:<Element name>|<Path><New Line>
示例:
FirstDirectory|First
FirstSecondDirectory|First\Second
FirstSecondThirdFileA|First\Second\Third\FileA
FirstSecondFourthFileB|First\Second\Fourth\FileB
答案 2 :(得分:0)
你能不能使用你的项目Properties.Settings?它存储在.config文件中,因此可以在部署后进行编辑
或者只是不要使它们成为常量,然后您可以在运行时编辑它们,然后在下次运行时恢复原始设置。
或者不要让calss静态并在每次使用时创建一个实例,然后更改所需的内容并在完成时丢弃该实例。