Avatar billede nitz Nybegynder
09. maj 2003 - 22:15 Der er 4 kommentarer og
1 løsning

sletning af bestemte filer på server

Hej Alle,

Jeg har en database som indeholder en masse filnavne på filer der ligger på en server. Der er gennem længere tid er blevet uploadet en masse filer som både bliver uploadet og registreret (filnavnet) i databasen.

Nu er det så sådan at nogle af disse filnavne er blevet slettet fra databasen igen, men selve filen er ikke blevet slettet fysisk.

Er det muligt at lave et script i ASP der går ud og ser om det der ligger i folderen matcher det der står i databasen og så sletter eventuelt overskydende filer?

Det drejer sig om et par 100 forskellige foldere der skal tjekkes igennem, men de har alle et nummer som passer med et nr i databasen.

Altså for eksempel står der i databasen:

foldernummer = 9
filnavn = sikkeetrod.jpg

Filen ligger så:

9/sikkeetrod.jpg

Samtidig ligger der også sådan en her:

9/jegerioverskud.jpg

og da den ikke står i databasen skal den slettes fysisk

Jeg ville bare nødig bruge flere dage på at tjekke det igennem manuelt hvis det nu kan gøres med et script?

Håber jeg har forklaret mig ordentligt, og håber endnu mere at det er muligt :)

hilsener

Tommy
Avatar billede eagleeye Praktikant
09. maj 2003 - 22:47 #1
Ja det er skam mulig.

Umiddelbart skal der bygges lidt sikker hed ind i det for den ikke abre sletter tilfældige filer så kan der ligge andre filer end eksvis billede filer som skal gemmen men som ikke er i databasen?
Og det kunne måske være smart at lave et filter som kun tager de fil eefternavne som du ved skal fjernes eksvis jpg,jpeg,bmp,gif  m.f.

Jeg har engang lavet et tilsvarne scritp som scannede en folder struktur igennem of lage filnavet ind i databasen. Så det kan tilrettes.

Er der en root folde hvor de andre foldere ligger i?
Avatar billede eagleeye Praktikant
09. maj 2003 - 22:49 #2
Kan der være flere sub folders?
9/9/img.jpg
Avatar billede eagleeye Praktikant
09. maj 2003 - 23:31 #3
Her er tilrettet kode så den kan slette filerne som ikke er i databasen.:

Da du angiver stien som eksvis  9/xxx.jpg i databasen er der to variable som skal sætte til at indeholde den folder som er root folder for filerne:

strPhysicalPath = "C:\Inetpub\wwwroot\eksperten\hyttetur"
strRelPath = "hyttetur/"

Som du kan se har jeg en folder som hedder hyttetur og i den ligger alle min billeder det er root folderen for alle mine billeder, der kan godt være under foldere i den eksvis  hyttetur/mandag/001.jpg
I databasen vil der ligge dette hvis et billede lå i selve hyttetur folderen: hyttetur/billedenavn.jpg  Så derfor skal strRelPath være lig med "hyttetur/" hvis det bare var billedenavn.jpg så skulle strRelPath = ""
strRelPath = "hyttetur/"


BEMÆRK FOR SIKKERHED: Så har jeg udkommentere den linje som sletter filen for du lige kan køre scritpet igennem og kigge på outputet om det ser fornuftigt ud. Hvis den skeriver den vil slette alle filerne så der noget galt med stierne.

        'DENNE LINJE SLETTER FILEN
'        fso.DeleteFile(file.path)


Når du køre det vil det eksvis skrive dette ud:
C:\Inetpub\wwwroot\eksperten\hyttetur.... Reletiv : hyttetur/
: Filnavn : hyttetur/00.jpg Findes ikke slettes!
: Filnavn : hyttetur/01.jpg Findes.



Du må lige rette i Connection til databasen så den passer med din database. Ligeledes den SQL sætning som tjekker om en fil findes, som er denne:

SQL = "SELECT ID FROM billeder WHERE billedenavn = '" & relPath & file.name & "'"

Der skal kolonne og tabel navn lige rettes til.



Her er så selv koden.:


<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("db101.mdb")

Set fso = CreateObject("Scripting.FileSystemObject")

function lookinfolder (foldernavn, relPath)
  Set objFolder = fso.getFolder( foldernavn )
  Response.Write objFolder.path & ".... Reletiv : " & relPath & "<br>"
  Response.Flush
 
  call scanFiles (objFolder.Path, relPath)
 
  For each Folder in objFolder.SubFolders
    lookinfolder Folder.path, relPath & Folder.name & "/"
  next
 
  Set objFolder = Nothing
end function

function scanFiles (foldernavn, relPath)
  Set objFolder = fso.getFolder( foldernavn )
  Set objFiles = objFolder.Files
  for each file in objFiles
    if InStr(1,"gif,jpg,jpeg,bmp", LCase(fso.GetExtensionName(file.name))) > 0 then
      SQL = "SELECT ID FROM billeder WHERE billedenavn = '" & relPath & file.name & "'"
      Set rs = Conn.Execute (SQL)
      if rs.EOF then
        'Filen findes ikke i DB:
        Response.Write " : Filnavn : " & relPath & file.name & " Findes ikke slettes! " & "<br>"
       
        'DENNE LINJE SLETTER FILEN
'        fso.DeleteFile(file.path)

       
      else
        Response.Write " : Filnavn : " & relPath & file.name & " Findes. " & "<br>"
      end if
      rs.Close
    end if
  next
  Set objFolder = Nothing
  Set objFiles = Nothing
end function





strPhysicalPath = "C:\Inetpub\wwwroot\eksperten\hyttetur"
strRelPath = "hyttetur/"

lookinfolder strPhysicalPath,strRelPath

Response.Write "Sådan .... fædig"

Conn.Close
Set Conn = Nothing
Set fso = Nothing
%>
</BODY>
</HTML>
Avatar billede bufferzone Praktikant
09. maj 2003 - 23:32 #4
det er vel filesystemsObject der skal bruges, den kan, son jeg husker det både håndtere folder og files. Så er det vel "bare" at lave en rutine der sammenligner databasens navne med de faktiske forhold og sletter de overskydende, eller simpelthen generere en ny database ud fra de faktiske forhold.
Det burde ikke være så svære, men mit ASP er meget rustent
Avatar billede hossein Nybegynder
10. maj 2003 - 13:35 #5
Den bedste løsning er en "file manager" uden brug af Database, her er en god ex: http://www.wexfms.com/home/product.asp?Id=1
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