如何组织大量的文件/目录路径常量

时间:2012-02-02 18:01:36

标签: c# file path code-organization

我有一个静态类,我保留了大量在我的应用程序中的不同位置使用的相对路径。它看起来像是:

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中声明的所有目录和文件都在应用程序中的大量位置使用(每个路径可以多次使用,考虑到有超过一百个路径的事实 - 这是一个很大的数字)。我想保持这个类的接口相同或对使用它们的其他类进行最小的更改。

3 个答案:

答案 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静态并在每次使用时创建一个实例,然后更改所需的内容并在完成时丢弃该实例。