Naviguer dans les dossiers

Soyez le premier à donner votre avis sur cette source.

Vue 29 063 fois - Téléchargée 479 fois

Description

C'est mon premier code posté, car débutant en ASP.NET et venant du VB6, y'a plein de questions au début que je me pose en codant...
Donc j'ai essayé de faire un code le plus simple possible pour naviguer dans les répertoires du serveur et d'afficher en même temps les fichiers...
Par contre aucune idée, si c 'est la technique officiel qu'il faut utiliser ou pas !!! donc je vous remercie de me donner des conseils...

Source / Exemple :


Téléchargez le ZIP pour avoir le projet !

En VB sous visual studio 2003, c 'est le code behind:
--------------------------------------------------------------------
Imports System.IO

Public Class WebForm1
    Inherits System.Web.UI.Page

    Private Const cSession_DossierEnCours = "DossierEnCours"
    Private Const cSession_ListeDossiers = "ListeDossiers"
    Protected WithEvents lblFichier As System.Web.UI.WebControls.Label
    Private Const cSession_ListeFichiers = "ListeFichiers"

#Region " Code généré par le Concepteur Web Form "

    'Cet appel est requis par le Concepteur Web Form.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub
    Protected WithEvents lblDossier As System.Web.UI.WebControls.Label
    Protected WithEvents dlDossiers As System.Web.UI.WebControls.DataList
    Protected WithEvents txtTypeFichier As System.Web.UI.WebControls.TextBox
    Protected WithEvents dlfichiers As System.Web.UI.WebControls.DataList
    Protected WithEvents cmdFichier As System.Web.UI.WebControls.LinkButton

    'REMARQUE : la déclaration d'espace réservé suivante est requise par le Concepteur Web Form.
    'Ne pas supprimer ou déplacer.
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN : cet appel de méthode est requis par le Concepteur Web Form
        'Ne le modifiez pas en utilisant l'éditeur de code.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Si la session existe pas: sauvegarde du répertoire par défaut
        If Session(cSession_DossierEnCours) Is Nothing Then
            Session(cSession_DossierEnCours) = Server.MapPath("")
        End If

        'Si la session existe pas: on récupere, affiche et sauvegarde la liste des répertoires
        If Session(cSession_ListeDossiers) Is Nothing Then
            mAffichage_Dossiers("")
        End If

        'Si la session existe pas: on récupere, affiche et sauvegarde la liste des fichiers
        If Session(cSession_ListeFichiers) Is Nothing Then
            mAffichage_Fichiers()
        End If

    End Sub

    Private Sub mAffichage_Dossiers(ByRef sPath As String)

        Dim sDirs As Array  'Liste des chemins des répertoires en bloc
        Dim sDir As String  'nom de chaque chemin de répertoire
        Dim Array As New ArrayList  'Tableau final avec juste le nom de chaque répertoire

        'Récupére dans la session le nom du répertoire en cours
        'j'utilise un objet directory car il s'occupe de mettre en forme valide un répertoire
        Dim oMyDir As Directory
        oMyDir.SetCurrentDirectory(Session(cSession_DossierEnCours))

        'Récupére tous les sous-répertoires complet
        sDirs = Directory.GetDirectories(oMyDir.GetCurrentDirectory & Path.DirectorySeparatorChar & sPath)

        'Réinitialise le répertoire en cours
        oMyDir.SetCurrentDirectory(oMyDir.GetCurrentDirectory & Path.DirectorySeparatorChar & sPath & Path.DirectorySeparatorChar)
        lblDossier.Text = oMyDir.GetCurrentDirectory
        'Sauvegarde dans la session le répertoire en cours
        Session(cSession_DossierEnCours) = oMyDir.GetCurrentDirectory

        'Met dans un tableau uniquement le nom de répertoire
        Array.Clear()
        Array.Add("../")
        For Each sDir In sDirs
            Array.Add(Path.GetFileName(sDir))
        Next

        'Affichage des répertoires dans une datalist
        With dlDossiers
            .DataSource = Array
            .DataBind()
            .Dispose()
        End With

        'Sauvegarde du tableau de répetoire dans une session
        'pour gérer par la suite l'événement de la datalist
        Session(cSession_ListeDossiers) = Array

    End Sub

    Private Sub mAffichage_Fichiers()

        Dim sFiles As Array 'Liste des fichiers en bloc
        Dim sFile As String 'nom de chaque fichier
        Dim Array As New ArrayList  'Tableau final avec la classe FileInfo concernant chaque fichier

        'Vérifie qu'il y a une extension
        Dim sTemp As String = txtTypeFichier.Text
        If sTemp.Length = 0 Then sTemp = "*.*"

        'Récupére la liste des fichiers du répertoire de la session
        sFiles = (Directory.GetFiles(Session(cSession_DossierEnCours), sTemp))
        For Each sFile In sFiles
            Array.Add(New FileInfo(sFile))
        Next

        'Affichage des fichiers dans une datalist
        With dlfichiers
            .DataSource = Array
            .DataBind()
            .Dispose()
        End With

        'Sauvegarde du tableau de fichier dans une session
        'pour gérer par la suite l'événement de la datalist
        Session(cSession_ListeFichiers) = Array

    End Sub

    Private Sub dlFichiers_EditCommand(ByVal source As System.Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs) Handles dlfichiers.EditCommand
        'Lorsque l'on clique sur un élément de la datalist
        'on récupére l'index pour savoir quel est l'élément du tableau sauvegardé
        'dans la session
        Dim oFile As FileInfo = Session(cSession_ListeFichiers)(e.Item.ItemIndex)
        lblFichier.Text = oFile.Name
    End Sub

    Private Sub dlDossiers_EditCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs) Handles dlDossiers.EditCommand
        'Lorsque l'on clique sur un élément de la datalist
        'on récupére l'index pour savoir quel est l'élément du tableau sauvegardé
        'dans la session
        mAffichage_Dossiers(Session(cSession_ListeDossiers)(e.Item.ItemIndex))
        mAffichage_Fichiers()
    End Sub

    Private Sub txtTypeFichier_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtTypeFichier.TextChanged
        mAffichage_Fichiers()
    End Sub
End Class

En VB sous visual studio 2003, c 'est le code HTML:
--------------------------------------------------------------------
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="index.aspx.vb" Inherits="nav_dossier.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
	<HEAD>
		<title>WebForm1</title>
		<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
		<meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
		<meta name="vs_defaultClientScript" content="JavaScript">
		<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
	</HEAD>
	<body>
		<font face="Tahoma" size="2">
			<form runat="server">
				Répertoire en cours: &nbsp;
				<asp:Label id="lblDossier" runat="server" ForeColor="Green">Label</asp:Label>
				<!-- Liste des répertoires -->
				<asp:datalist id="dlDossiers" runat="server" ShowHeader="False" ShowFooter="False" RepeatDirection="Vertical"
					RepeatColumns="1">
					<ItemTemplate>
						<font face="Tahoma" size="2">
							<asp:LinkButton id="cmdDossier" CommandName="edit" runat="server">
								<%# container.dataitem %></font> </asp:LinkButton>
					</ItemTemplate>
				</asp:datalist><br>
				Type de fichiers:
				<asp:TextBox id="txtTypeFichier" runat="server" Width="32px">*.*</asp:TextBox>
				<!-- Liste des fichiers -->
				<asp:datalist id="dlfichiers" runat="server" ShowHeader="False" ShowFooter="False" RepeatDirection="Vertical"
					RepeatColumns="1">
					<ItemTemplate>
						<font face="Tahoma" size="2">
							<asp:LinkButton id="cmdFichier" CommandName="edit" runat="server">
								<%# container.dataitem %>
							</asp:LinkButton>
						</font>
					</ItemTemplate>
				</asp:datalist>
				<br>
				<br>
				<asp:Label id="lblFichier" runat="server" ForeColor="Green"></asp:Label>
			</form>
		</font>
	</body>
</HTML>

Conclusion :


Je viens d'avoir un message sur le forum(en référence à une question concernant cette source) du trés trés actif Fabrice69... Il a un source qui fait bien plus que cet exemple: http://www.aspfr.com/code.aspx?id=23262

Mais bon cet exemple est surtout fait pour avoir votre avis sur la technique utilisée...

Merci

Bart-Rennes

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
211
Date d'inscription
vendredi 12 décembre 2003
Statut
Membre
Dernière intervention
15 janvier 2010

Ok je le note, merci.
C'est justement ce type de retour qui fait avancé les choses... Avoir l'avis des autres est trés important.

bye
Messages postés
1765
Date d'inscription
jeudi 12 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013
6
Un conseil tout de même pour les prochains développement :
- Evite d'utiliser des mots réservés pour les déclarations de tes variables

Dans cet exemple tu définis 'Array' comme une variable de type ArrayList. Or Array est aussi un type de variable :
- http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemArrayMembersTopic.asp

De ce fait, ca peut être dangereux mais surtout la comprehension de ton code est dégradée à cause de cela.

F___
Messages postés
1765
Date d'inscription
jeudi 12 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013
6
Les principales différences entre nos deux projets sont :
- le tien est lié aux répertoires où se trouve placé l'application WEB.
- dans ton application, le stockage des variable est fait en session.

En tous cas, c'est une bonne idée de commencer avec ce type d'exemple ar ca utilise un peu tout en même temps.

F___

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.