Je dois combiner deux URIS relatives, par ex. Dois-je une option autre que de vérifier une barre oblique de traction, puis de la combinaison de chemins Moi-même? p> Edit: p> Voici un cas de test qui démontre que la path.combine ne fonctionnera pas pour le cas lorsque la première URL ne contient pas déjà une barre oblique suivante: P > ../ mypath / code> et
myImage.png code> pour créer
../ mypath / myimage.png code>. Ils ne sont pas des chemins vers des fichiers sur disque, de sorte que
path.combine code> n'est pas approprié (ce sont des chemins relatifs des ressources pour une page Web).
nouvel URI code> jette un
argumentoutofrantageeexception code> car l'uri de base est relatif (non absolu).
// The first case fails with result "../testpath\resource.png"
[TestCase("../testpath", "resource.png", "../testpath/resource.png")]
[TestCase("../testpath/", "resource.png", "../testpath/resource.png")]
public void TestPathCombine(string path, string resourceName, string expectedResult) {
string result = Path.Combine(path, resourceName);
Assert.AreEqual(expectedResult, result);
}
3 Réponses :
N'utilisez pas de path.combine tel qu'il est pour le chemin physical afin qu'il puisse vous confondre avec des barres obliques. Vous pouvez faire votre propre fonction d'Uri Combinez. Vérification de la barre oblique à la fin et annoncez-la à la suivante.
Constructeur URI de deux arguments? p>
Comme je l'ai dit dans le post en utilisant ce nouveau constructeur de l'URI échoue avec un argumentoutofrangeException code> car la baseuri est relatif. Créer ma propre fonction semble vraiment comme ma seule option.
Je pense que c'est la meilleure façon de le faire. Prenez l'aide de la classe VirtualPathutility. Il a combiné la fonction mais je ne suis pas sûr que cela correspond exactement à votre exigence. Mais il a des fonctions qui pourraient aider à en faire un. par exemple. APPENDRAILSLASH ET APPENDRAILSLASH
VirtualPathutility.AppendtrailingSlash PLUS Simple String Concaténation résout cette question. Cependant, à la fin, j'ai décidé d'exiger et de documenter que la barre oblique de fin était nécessaire pour le chemin de la base en premier lieu.
Grande Lawrence. Et il serait utile que vous éditez votre message et mettez la fonction ici car cela pourrait aider les personnes qui visitent ce message: P
Vous pouvez utiliser le constructeur Par exemple, combinant Maintenant omettez la barre oblique suivante: combinez Cela donne un sens si vous le pensez comme à partir d'une uri de base de Si vous savez toujours qu'ils devraient être ajoutés, vous devez vous assurer que la base se termine par une barre oblique avant de combiner. p> uri code> qui prend une base et un élément relatif pour effectuer la combinaison - mais noter que le comportement ne sera peut-être pas ce que vous attendez. La classe
URI code> verra la partie d'extrémité de votre base comme un "répertoire" ou un "fichier" (pour le mettre en termes de chemin). S'il voit la fin sous forme de fichier, cela sera supprimé. P>
http: // serveur / quelque chose / code> avec
ressource.png code> vous donnera
http: //server/something/resource.png code>. p>
http: // serveur / quelque chose code> avec
ressource.png code> et obtenir
http: //server/resource.png < / code>. p>
http: //server/something.png code> et demandant le rapport uri
ressource.png code> :
http: //server/somethi.png/resource.png code> n'est pas ce que vous cherchez. p>
Si votre deuxième partie est (comme dans mon propre cas) vraiment un nom de fichier sans une évasion (et peut contenir des invalides caractères pour une URL), voici la solution que j'ai fini par:
/// <summary> /// Convert a partial file path to a partial url path. /// </summary> /// <param name="partialFilePath">The partial file path.</param> /// <returns>A partial url path.</returns> public static string ConvertPartialFilePathToPartialUrlPath( string partialFilePath) { if (partialFilePath == null) return null; return string.Join("/", partialFilePath.Split('/', '\\') .Select(part => Uri.EscapeDataString(part))); }
Dupliqué possible de Combinez de base relatif avec chemin relatif