Avatar billede aero Nybegynder
15. januar 2006 - 17:13 Der er 21 kommentarer og
1 løsning

se om mappen findes..

Hej
Jeg har lavet dette pt. som funger takket værer nielle.
http://www.aeronet.dk/uscript/folder_file.asp

Jeg ville høre om jeg kan lave noget som kigger på om en mappe findes..

altså hvis jeg vil oprette eller rename en mappe så ser den om det valgte navn er optaget, hvis ikke så opretter den mappen som nu og ellers ommer den med en fejl at "mappen kan ikke laves da navn er optaget".

min kode er dette:
<%@ Language=VBScript %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
Dim SiteName
SiteName = LCase(Request.ServerVariables("SCRIPT_NAME"))
Response.Buffer = True
Session.LCID = 1030
%>
<html>
<head>
<title>Upload-Script</title>
<meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />
<meta http-equiv="content-language" content="dan" />
<link rel="stylesheet" type="text/css" href="include/style.css" title="style" />
<style type="text/css">td img {display: block;}</style>
</head>
<body bgcolor="#ffffff">
<form action="<% =SiteName %>?fsostatus=creating_folder" method="Post">
<input type="text" name="Foldername">
<button type="submit">Create</button>
</form>
<%
Dim ServerMappath
ServerMappath = "./images/upload"

Dim Folder
Folder = Server.Mappath(ServerMappath)

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

fsostatus = Request("fsostatus")

Select Case fsostatus

Case "creating_folder"
    'Creat_Folder

    Dim FolderName, AddFolder
    FolderName = Request("Foldername")
    AddFolder = Folder &"/"& FolderName
    objFSO.CreateFolder(AddFolder)
    Response.Redirect(SiteName)
    ' Set objFSO = Nothing

Case "deleting_folder"
    'Delete_Folder

    Dim FolderNameDel, DelFolder
    FolderNameDel = Request("del")
    DelFolder = Folder &"\"& FolderNameDel
    objFSO.DeleteFolder(DelFolder)
    Response.Redirect(SiteName)
    ' Set objFSO = Nothing

Case "renaming_folder"
    'Rename_Folder
    Session("GetFolder") = Request("rename")
    Response.Write("<form action="""&SiteName&"?fsostatus=renaming_folder_finish"" method=""Post"">") & _
                  ("<input type=""text"" name=""Folderrename""  value="""&Session("GetFolder")&""">") & _
                  ("<button type=""submit"">Rename</button></form>")

Case "renaming_folder_finish"
    Dim FolderRename   
    FolderRename = Request("Folderrename")
    objFSO.MoveFolder Folder&"\"&Session("GetFolder") , Folder&"\"&FolderRename
    Response.Redirect(SiteName)
   
End Select

'Folder_List
Dim  objFolder
Set objFolder = objFSO.GetFolder(Folder)

Dim Fold, Folders, strTemp
Set Folders = objFolder.SubFolders

For Each Fold In Folders
    strTemp = Fold.Name
    Response.Write(strTemp & " <a href=" & SiteName & "?fsostatus=deleting_folder&del=" & Server.URLEncode(strTemp) & ">[ Delete ]</a>&nbsp;&nbsp;<a href=" & SiteName & "?fsostatus=renaming_folder&rename=" & Server.URLEncode(strTemp) & ">[ Rename ]</a><br>")
Next
%>
Avatar billede softspot Forsker
15. januar 2006 - 17:27 #1
Du kan benytte objFSO.FolderExists(sti_til_folder) for at undersøge om en folder eksisterer...
Avatar billede aero Nybegynder
15. januar 2006 - 18:40 #2
og hvordan med fejlmelding !?
Avatar billede softspot Forsker
15. januar 2006 - 19:02 #3
Umiddelbart ville jeg bare smide en if-sætning omkring den kode der skal håndtere oprettelse/omdøbning af en folder. Noget i stil med dette:


Case "creating_folder"
    'Creat_Folder

    Dim FolderName, AddFolder
    FolderName = Request("Foldername")
    AddFolder = Folder &"/"& FolderName
    if not objFSO.FolderExists(AddFolder) then
      objFSO.CreateFolder(AddFolder)
      Response.Redirect(SiteName)
      ' Set objFSO = Nothing
    else
      Response.Write "Folderen eksisterer allerede. Vælg venligst et andet navn."
    end if
Avatar billede aero Nybegynder
15. januar 2006 - 21:37 #4
istedetfor at lave en response.write kunne jeg så ikke lave en session("error") = "Folderen eksisterer allerede. Vælg venligst et andet navn." og så Response.Redirect(SiteName)

så i min Folder_list opsætning hare en if sætning ang. hvis Session("error") <> "" så response.write session("error") else INTET.
!?
Avatar billede softspot Forsker
15. januar 2006 - 21:57 #5
Jo, det er en anden mulighed. Valget af løsning på fejlmeldingsproblemetikken, afhænger af hvad du har tænkt dig der skal ske efterfølgende og hvordan. Du kan i princippet vælge mange forskellige løsninger, response.write var bare en hurtig løsning til at illustrere den tilstand at folderen fandtes i forvejen...
Avatar billede aero Nybegynder
15. januar 2006 - 22:29 #6
okay så lave en Session("error") som efter en fejl bliver til INTET og hvis der senere kommer en ny fejl bliver til den nye fejl er ikke en dum idee eller ville du bruge noget anden frem for en session !?

Havde tænkt lidt på at jeg i en asa fil vil kunne lave noget ang. at hvis session("error") bliver noget andet en "" altså intet så kunne det gemmes i en database på den måde ved jeg også når andre kigger på sitet så gemmes alle evt fejl i den så jeg kan gennemgå dem senere..

men ved ikke om jeg skal lave det med session eller om det klart ville være en god ting da jeg har mange muligheder med denne session der efter eller om jeg skulle bare lave en alm. javascript fejl melding..
Avatar billede softspot Forsker
15. januar 2006 - 22:51 #7
Igen det afhænger af hvad dine krav til systemet er. Hvis du vil kunne spore fejl tilbage til en bruger og et tidspunkt, så kan det være en fin idé, at gemme dem i en database (sammen med en række andre oplysninger så som brugerid, tidspunkt, hvilken side fejlen skete osv.), men hvis du bare skal fortælle brugeren, at den mappe som han/hun forsøger at oprette allerede eksisterer, så er det nok at skyde gråspurve med kanoner at sætte en database op til at håndtere dette. Hvorvidt det er nødvendigt at benytte en session til at opbevare fejlen afhænger også lidt af hvorlænge du skal gemme på fejlen. Hvis det bare er til den næste side, så kunne du f.eks. benytte en queryparameter til den side som indeholder et fejlnummer eller teksten. På den måde kan du spare session-objektet og dermed lidt serverresurser.

Det er altså svært at give dig et entydigt svar på hvad der er godt eller dårligt, da det som sagt afhænger af i hvilken kontekst det skal benyttes.
Avatar billede aero Nybegynder
15. januar 2006 - 23:25 #8
okay jeg siger mange tak for en god besvarelse, vil lige se hvad jeg kan finde om queryparameter så jeg ved hvad du mener da jeg er ret grøn i nogle eksempler mm. men 1000 tak alligevel. og også for den delvise løsning du gav til mig i Kommentar: softspot
15/01-2006 19:02:11

vil du lægge et svar.
Avatar billede softspot Forsker
15. januar 2006 - 23:30 #9
Med queryparametre mener jeg bare at når du kalder en anden side med f.eks. response.redirect, så kan du tilføje en række ekstrainformationer i den url du specificerer, f.eks.:

response.redirect "side2.asp?fejlkode=10&tekst=Mappen+findes+allerede"

Jeg har her indsat + som oversættes til mellemrum i en URL, men du bør nok benytte Server.URLEncode i stedet - den er langt mere sikker, f.eks.:

response.redirect Server.URLEncode("side2.asp?fejlkode=10&tekst=Mappen findes allerede")
Avatar billede aero Nybegynder
16. januar 2006 - 11:53 #10
okay vil det sige så skal jeg bruge:

StrError = Request("fejlkode") for at få vist "10"
response.write (StrError)
StrErrorText = Request("tekst") for at få vist "Mappe findes allerede"
response.write (StrErrorText)

!?
På forhånd igen 1000 tak.
Avatar billede softspot Forsker
16. januar 2006 - 12:35 #11
Ja, det er korrekt.

Jeg vil dog anbefale at du benytter den eksplicitte notation til at få fat i querystring-parametre, nemlig request.querystring("fejlkode") og request.querystring("tekst") i stedet for request("fejlkode") og request("tekst"). Det sparer serverresurser, da serveren kan spørge den rigtige liste med det samme. Hvis du ikke angiver listen (i dette tilfælde QueryString) skal serveren potentielt igennem flere lister på request-objektet inden den finder den rigtige værdi.

Selvom det måske ikke er så relevant for dig i øjeblikket, så er det ingen skade til at anlægge sig nogle gode kodevaner fra starten ;-) - den eksplicitte reference til listen kan også være med til at undgå fejl, som kan være svære at finde. Hvis der f.eks er et felt som hedder fejlkode i en form du poster samtidig med at der er en parameter med samme navn i din url og du bare kalder request("fejlkode") så er det ikke klart hvilken værdi du rent faktisk får fat i - om ikke andet så bliver koden sværere at læse og det er ikke et mål du bør sigte efter... for din egen skyld :)

...og tak for point i øvrigt :)
Avatar billede aero Nybegynder
16. januar 2006 - 17:27 #12
det var så lidt.... kom forresten til at tænke på om man kan sætte "tekst=" til at være flere ting i samme linje !? altså evt.
fejlkode=10&tekst=Mappen findes allerede=Mappen er også skrivebeskyttet") og kam man lave noget med <br> i linjen så man har får et linje skift. !?
Avatar billede softspot Forsker
16. januar 2006 - 17:47 #13
Der er nogle specielle tegn som kan give dig udfordringer når du benytter url med parametre, f.eks. &, |, <, >, /, \, ? osv, der allerede har en betydning i en url. Du kan muligvis komme omkring disse med Server.URLEncode, men jeg vil ikke anbefale at du kaster dig ud i for komplekse datastrukturer i dine url'er.

Hvis du skal overføre større og mere komplicerede mængder af data til en anden side, bør du nok overveje en anden løsning (såsom session, database eller form post). Der er dog ikke noget i vejen med at lave en ny parameter, f.eks. tekst2 til at holde en evt. alternativ tekst (og dem kan du jo lave flere efter behov). Du kan hente disse parametre ud af request.querystring via et loop på modtagersiden, f.eks. finder denne rutine alle url-parametre der starter med tekst (tekst, tekst1, tekst2 osv) og udskriver værdien af dem - du kan naturligvis ombygge den til at tjene dit formål, dette er blot for at demonstrere princippet i at hente værdier ud af request-objektet:

for each par in request.querystring
  if left(par,5) = "tekst" then
    response.write request.querystring(fld) & "<br>"
  end if
next

Pas dog på med at overføre for mange informationer for der er en begrænsning i længden af en url, som nogle browsere håndhæver mere strengt end andre (jeg tror det er omkring 1000 tegn eller noget i den stil).
Avatar billede softspot Forsker
16. januar 2006 - 17:48 #14
Ups! Rutinen skal lige rettes en smule:

for each par in request.querystring
  if left(par,5) = "tekst" then
    response.write request.querystring(par) & "<br>"
  end if
next
Avatar billede aero Nybegynder
16. januar 2006 - 19:11 #15
okay jeg siger tak..

Jeg har dog først kunne tjekke om det virkede mm. nu og jeg er støt på en lille fejl håber du kan hjælpe.

http://www.aeronet.dk/uscript/folder_file.asp

som du kan se findes test mappen, prøv evt at lave "test" mappen igen så ser du fejlen.

min kode er:
<%@ Language=VBScript %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
Dim SiteName
SiteName = LCase(Request.ServerVariables("SCRIPT_NAME"))
Response.Buffer = True
Session.LCID = 1030
%>
<html>
<head>
<title>Upload-Script</title>
<meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />
<meta http-equiv="content-language" content="dan" />
<link rel="stylesheet" type="text/css" href="include/style.css" title="style" />
<style type="text/css">td img {display: block;}</style>
</head>
<body bgcolor="#ffffff">
<%
Dim ServerMappath
ServerMappath = "./images/upload"

Dim Folder
Folder = Server.Mappath(ServerMappath)

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

fsostatus = Request("fsostatus")

Select Case fsostatus

Case "creating_folder"
    'Creat_Folder
    Response.Write("<form action='" & SiteName & "?fsostatus=creating_folder_finish' method='Post'>") & _
                  ("<input type='text' name='Foldername'>") & _
                  ("<button type='submit'>Create</button></form>")

Case "creating_folder_finish"                 
    Dim FolderName, AddFolder
    FolderName = Request("Foldername")
    AddFolder = Folder &"/"& FolderName
    If Not objFSO.FolderExists(AddFolder) Then
      objFSO.CreateFolder(AddFolder)
    Else
      Response.Redirect Server.URLEncode(SiteName&"?errortext=Mappen findes allerede, opret evt mappen under et andet navn.")
    End If
    Response.Redirect(SiteName)
    ' Set objFSO = Nothing

Case "deleting_folder"
    'Delete_Folder

    Dim FolderNameDel, DelFolder
    FolderNameDel = Request("del")
    DelFolder = Folder &"\"& FolderNameDel
    objFSO.DeleteFolder(DelFolder)
    Response.Redirect(SiteName)
    ' Set objFSO = Nothing

Case "renaming_folder"
    'Rename_Folder
    Session("GetFolder") = Request("rename")
    Response.Write("<form action='" & SiteName & "?fsostatus=renaming_folder_finish' method='Post'>") & _
                  ("<input type='text' name='Folderrename'  value='"&Session("GetFolder")&"'>") & _
                  ("<button type='submit'>Rename</button></form>")

Case "renaming_folder_finish"
    Dim FolderRename   
    FolderRename = Request("Folderrename")
    objFSO.MoveFolder Folder&"\"&Session("GetFolder") , Folder&"\"&FolderRename
    Response.Redirect(SiteName)
   
End Select

If Request.Querystring("errortext") <> "" Then
  Response.Write ("<font color='#FF0033'>"&request.querystring("errortext")&"</font><br>")
Else
  Response.Write("")
End If
 
'Folder_List
Dim  objFolder
Set objFolder = objFSO.GetFolder(Folder)

Dim Fold, Folders, strTemp
Set Folders = objFolder.SubFolders

For Each Fold In Folders
    strTemp = Fold.Name
    Response.Write(strTemp & " <a href='" & SiteName & "?fsostatus=deleting_folder&del=" & Server.URLEncode(strTemp) & "'>[ Delete ]</a>&nbsp;&nbsp;<a href='" & SiteName & "?fsostatus=renaming_folder&rename=" & Server.URLEncode(strTemp) & "'>[ Rename ]</a><br>")
Next

Response.Write("<a href='" & SiteName & "?fsostatus=creating_folder'>[ Creat Folder ]</a>")
%>
Avatar billede softspot Forsker
16. januar 2006 - 19:30 #16
Jeg tror det er fordi du kalder Server.URLEncode på den samme streng to gange, det kan den ikke finde ud af, så du er nød til at arbejde på den "rene" url når du kalder URLEncode...
Avatar billede aero Nybegynder
16. januar 2006 - 21:42 #17
ahh tak nu fik jeg det til at virker...
Avatar billede aero Nybegynder
16. januar 2006 - 21:51 #18
ahh fik en anden fejl med det folderexists.

http://www.aeronet.dk/uscript/folder_file.asp

hvis du har tid til at prøve at rename en mappe til en der findes iforvejen så får jeg en "File already exists" fejl.

hvad kan fejlen være i:
Case "renaming_folder"
    'Rename_Folder
    Session("GetFolder") = Request("rename")
    Response.Write("<form action='" & SiteName & "?fsostatus=renaming_folder_finish' method='Post'>") & _
                  ("<input type='text' name='Folderrename'  value='"&Session("GetFolder")&"'>") & _
                  ("<button type='submit'>Rename</button></form>")

Case "renaming_folder_finish"
    Dim FolderRename   
    FolderRename = Request("Folderrename")
    If Not objFSO.FolderExists(FolderRename) Then
    objFSO.MoveFolder Folder&"\"&Session("GetFolder") , Folder&"\"&FolderRename
    Else
      Response.Redirect(SiteName&"?errortext=Mappen findes allerede, tildel evt. mappen et andet navn.")
    End If
    Response.Redirect(SiteName)

linje 71 = objFSO.MoveFolder Folder&"\"&Session("GetFolder") , Folder&"\"&FolderRename
Avatar billede softspot Forsker
17. januar 2006 - 00:57 #19
Prøv at ændre denne linie:

If Not objFSO.FolderExists(FolderRename) Then

til

If Not objFSO.FolderExists(Folder&"\"&FolderRename) Then

for ellers tester du på en anden folder end den du vil rename til...
Avatar billede aero Nybegynder
17. januar 2006 - 11:10 #20
ahh kigger lige på der ved 19 tiden idag, pt tak ^^
Avatar billede aero Nybegynder
17. januar 2006 - 18:25 #21
1000 tak det virkede..
Avatar billede softspot Forsker
17. januar 2006 - 22:06 #22
Det var så lidt :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester