Ограничение записи файла / папки в пути, отличные от указанного корня - PullRequest
3 голосов
/ 01 ноября 2009

В .NET есть ли API, который позволяет мне ограничивать некоторые операции ввода-вывода указанным путем?

Например:

  • Root Path: C:\Test\

Теперь я хочу вызвать такую ​​функцию:

  • IO.Directory.CreateDirectory("../testing/",Root)

И теперь я хочу, чтобы API справился с этой ситуацией для меня и не создавал папку, отличную от указанной директории.

Так что это должно быть создано как c:\Test\testing\ вместо c:\testing\.

Я знаю, что могу сделать это вручную, но я подумал, что, может быть, есть API, который я не знаю, который поддерживает такую ​​вещь.

Дело в том, что у меня есть куча случайных строк, и я буду создавать папки и файлы на их основе, я не хочу ничего записывать в другую папку, потому что одна из этих строк содержит строку типа "../ «

Ответы [ 4 ]

1 голос
/ 01 ноября 2009

В * nix envoirnements, которые называются chroot (jailroot). Я не уверен, есть ли что-то подобное в .net, но вы можете попробовать Google chroot для .net (или jailroot для .net).

0 голосов
/ 22 ноября 2009

Я не знаю ни одного встроенного .NET API, чтобы делать то, что вы хотите. Я не могу придумать ничего другого, кроме как использовать Path.Combine(), чтобы объединить строки в полный путь, а затем вручную проверить, находится ли он в том месте, где вы хотите.

0 голосов
/ 01 ноября 2009

Кроме использования класса DirectoryInfo, я бы предложил создать простой метод расширения и использовать статический метод Path.Combine.

// Extension Method
public static class DirectoryExtension
{
    public static void CreateDirectory(this DirectoryInfo root, string path)
    {
        if (!Directory.Exists(root.FullName))
        {
            Directory.CreateDirectory(root.FullName);
        }

        string combinedPath = Path.Combine(root.FullName, path);
        Directory.CreateDirectory(combinedPath);
    }
}

// Usage
DirectoryInfo root = new DirectoryInfo(@"c:\Test");
root.CreateDirectory("testing");
root.CreateDirectory("testing123");
root.CreateDirectory("testingabc");
root.CreateDirectory(@"abc\123");
0 голосов
/ 01 ноября 2009

Я нашел один:

DirectoryInfo.CreateSubdirectory()

не то же самое, но похоже, он проверяет, является ли данный путь фактически подкаталогом или нет.

...