Utilisation de Server.MapPath dans des classes C # externes dans ASP.NET


132

J'essaye d'obtenir le chemin absolu de certains fichiers dans une classe C #. Server.MapPathfonctionne très bien bien sûr pour ASPX et leurs pages code-behind, mais cela n'existe pas dans un autre fichier de classe. J'ai essayé HostingEnvironment.MapPath(), mais cela se plaint que le chemin virtuel relatif n'est pas autorisé. Des pensées?

System.Web est déjà importé.

Réponses:


302

La ServerUtilityclasse est disponible en tant qu'instance dans votre HttpContext. Si vous êtes dans un environnement où vous savez qu'il sera exécuté dans le pipeline ASP.Net, vous pouvez utiliser

HttpContext.Current.Server.MapPath()

Vous devrez cependant importer System.Web.


1
Même si ce post date de plus de 2 ans, vous m'avez énormément aidé. Merci.
iarwain01

6
Et s'il n'est pas exécuté dans ce pipeline?
zaitsman

Si vous n'exécutez pas à l'intérieur d'ASP.Net, il est peu probable que votre HttpContext soit défini, à moins que vous n'ayez écrit votre propre pipeline :) Vous devrez vous fier aux méthodes fournies par votre contexte d'exécution (routeur?). Si votre processus a un aperçu des bases de votre routage de chemin, vous pouvez jeter un œil aux méthodes System.IO.Path.
womp

Ce contexte compilé mais est nul en dehors des contrôleurs, donc mes erreurs de code. Je pense que womp dit la même chose ici. Si tel est le cas, pouvez-vous accéder à MapPath en dehors des routeurs?
edencorbin

34

vous pouvez aussi utiliser:

var path = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/myfile.txt")

si

var path = Server.MapPath("~/App_Data");
var fullpath = Path.Combine(path , "myfile.txt");

est inaccessible


8

Ne pouvez-vous pas simplement ajouter une référence System.Webet ensuite l'utiliser Server.MapPath?

Edit: De nos jours, je recommande d'utiliser la HostingEnvironment.MapPathméthode :

C'est une méthode statique dans l' System.Webassemblage qui mappe un chemin virtuel vers un chemin physique sur le serveur. Il ne nécessite pas de référence à HttpContext.


Pas dans les classes externes.
funwhilelost

Bien sûr, vous pouvez ajouter la référence à une classe externe; mais évidemment vous devez l'utiliser dans le contexte d'une requête serveur donc HttpContext n'est pas nul.
Dan Diplo

4
System.Reflection.Assembly.GetAssembly(type).Location

SI le fichier que vous essayez d'obtenir est l'emplacement d'assemblage d'un type. Mais si les fichiers sont relatifs à l'emplacement de l'assembly, vous pouvez l'utiliser avec l' System.IOespace de noms pour obtenir le chemin exact du fichier.


-1: Qu'est-ce qui vous a amené à croire qu'il voulait le lieu d'une assemblée?
John Saunders

1
Il a dit que "certains fichiers", il n'a pas spécifié l'emplacement ou la nature des fichiers, ainsi connaître l'emplacement de l'assemblage et pouvoir travailler par rapport à ce chemin peut être utile. Bien sûr, s'il avait effectivement déclaré qu'il était toujours dans un HttpContext, je n'aurais pas pris la peine de répondre.
David McEwing

David McEwing, ce que vous suggérez ne fonctionnera pas car IIS ne charge pas les assemblys à partir de l'emplacement où vous les installez, sur le site Web. Ils sont copiés et chargés à partir d'un emplacement de cache asp.net temporaire, donc faire un GetAssembly ou GetExecutingAssembly vous dirigera vers l'emplacement de l'assembly, mais cela n'aurait rien à voir avec l'emplacement du site Web vers lequel MapPath pointe.
zumalifeguard

4

J'utilise aussi ceci:

System.Web.HTTPContext.Current.Server.MapPath

3
class test
{
public static void useServerPath(string path)
{
   if (File.Exists(path)
{
 \\...... do whatever you wabt
}
else
{
\\.....
}
}

Maintenant, quand vous appelez la méthode depuis le codebehind

par exemple :

protected void BtAtualizacao_Click(object sender, EventArgs e)
        {
             string path = Server.MapPath("Folder") + "\\anifile.txt";

            test.useServerPath(path);
}

de cette façon, votre code est trop simple et avec une méthode, vous pouvez utiliser plusieurs chemins pour chaque appel :)


3

Celui-ci m'a aidé

//System.Web.HttpContext.Current.Server.MapPath //        
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/File.txt"),
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);

Bienvenue dans stackoverflow. Une petite explication supplémentaire aiderait les autres programmeurs à comprendre pourquoi la solution a fonctionné.
NJInamdar

1

Que vous exécutiez dans le contexte d'ASP.NET ou non, vous devriez pouvoir utiliser HostingEnvironment.ApplicationPhysicalPath


0

Le server.mappath ("") fonctionnera sur la page aspx, si vous voulez obtenir le chemin absolu d'un fichier de classe, vous devez utiliser ceci-

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.