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é.

Chet
la source

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.

womp
la source
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

Manoir Yakir
la source
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.

Dan Diplo
la source
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.

David McEwing
la source
-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
étonnant
la source
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 :)

Ahmad
la source
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);
netuser
la source
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

Daudihus
la source
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")
Debendra Dash
la source