2009-11-01 7 views
3

Dans .NET existe-t-il une API qui me permet de restreindre certaines opérations d'E/S au chemin spécifié?Restriction de l'écriture de fichier/dossier sur des chemins autres que la racine spécifiée

Par exemple:

  • Root Path: C:\Test\

Maintenant, je veux appeler une fonction comme ceci:

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

Et maintenant, je veux l'API gérer cette situation fo r moi et ne crée pas un dossier autre que le répertoire spécifié. Cela devrait être créé comme c:\Test\testing\ au lieu de c:\testing\.

Je sais que je peux le faire manuellement mais je pensais que peut-être il y a une API que je ne connais pas qui supporte une telle chose. Le truc, c'est que j'ai des tas de chaînes aléatoires et que je créerai des dossiers et des fichiers basés sur eux, je ne veux rien écrire dans un autre dossier car une de ces chaînes inclut une chaîne comme "../"

Répondre

1

In * nix envoirnements c'est ce qu'on appelle un chroot (jailroot). Je ne suis pas sûr s'il y a quelque chose comme ceci dans. Net, mais vous pouvez essayer google chroot pour. Net (ou jailroot pour. Net).

+0

chroot est un peu plus à propos des permissions, je suis plus après un simple appel d'API qui va prendre les problèmes de canonisation pour moi. –

0

J'ai trouvé un:

DirectoryInfo.CreateSubdirectory() 

pas exactement la même chose mais similaire, il vérifie si le chemin donné est en fait un sous-répertoire ou non.

0

Outre l'utilisation de la classe DirectoryInfo, je suggère de créer une méthode d'extension simple et d'utiliser la méthode statique 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

Combine ne fonctionnera pas dans ce cas: Path.Combine ("c: \ test \", "\ inroot") == "c: \ inroot" –

0

Je ne connais aucune API .NET intégrée pour faire ce que vous voulez. Je ne peux pas penser à autre chose que d'utiliser Path.Combine() pour combiner les chaînes dans un chemin d'accès complet, puis vérifier manuellement si elle est ancrée où vous le souhaitez.