webForumDet fria alternativet

Recordset uten DB

ASP

6 svar · 300 visningar · startad av Jacob

Medlem sedan dec. 2000503 inlägg
Frågan#1

Jag håller på att göra ett script som ksa flytta be bilder srån en mapp som INTE är dubbleter.
Jag har alltså en mapp men den massa under mappar. De flesta bilder fins det dubbletter av.
Det jag vill är att jag vill flytta alla bilder som det bara finns en kopia av.

<!-- #include file="adovbs.inc" --> 
<%
Server.ScriptTimeout = 3600

Dim fso, folders, folder, files, FolderContents, FileItem, temp, procent
Set rs = Server.CreateObject("Adodb.Recordset")
With rs
   .CursorLocation = adUseClient
   .Fields.Append "s", adInteger
   .Fields.Append "n", adVarChar, 500
   .Fields.Append "d", adDBTimeStamp
   .open
End With
Sub addfile( Id, Name, Group )
   rs.AddNew
	  rs( "n" ) = Id
	  rs( "d" ) = Name
	  rs( "s" ) = Group
   rs.Update
End Sub 
Set Image = Server.CreateObject("SImageUtil.Image")
Image.PhysicalPath = TRUE

function GetSubFolders(pfolder)
    Dim sFolders, fldr, fil

    For Each fldr In pfolder.SubFolders
        sFolders = sFolders & GetSubFolders(fldr)
    Next
    
    For Each FileItem In pfolder.Files
		If Lcase(right(FileItem,3)) = "jpg" or Lcase(right(FileItem,3)) = "gif" Then
			session("fil") = FileItem.path
			Image.OpenImageFile(FileItem)
			If len(Image.GetExif("Date"))=0 Then
				datum = fileItem.DateLastModified
			Else
				datum = Cdate(replace(left(Image.GetExif("Date"),11),":","-")&right(Image.GetExif("Date"),8))
			End If
			addfile FileItem.path, datum, FileItem.Size
			image.close
		End If
    Next
    
    Set fileItem = Nothing
    Set fldr = Nothing
    
    GetSubFolders = sFolders
End function

Set fso = CreateObject("Scripting.FileSystemObject")
Set folders = fso.getFolder("E:\bilder\")
GetSubFolders(folders)

Det som ligger i mitt recset nu är alla bilder som finns i mappen bilder och dess undermappar.

Hur gör jag nu för att skriva ut vilka biler det bara finns en kopia på?

Medlem sedan juni 20022 599 inlägg
#2

Ett förslag. Ändra ditt recordset så att du även sparar själva filnamnet:

<%
With rs
   .CursorLocation = adUseClient
   .Fields.Append "s", adInteger
   .Fields.Append "FullPath", adVarChar, 500
   .Fields.Append "d", adDBTimeStamp
   .Fields.Append "FileName", adVarChar, 500
   .open
End With

' ..

Sub addfile( FullPath, Name, Group, FileName )
   rs.AddNew
	  rs( "FullPath" ) = FullPath
	  rs( "d" ) = Name
	  rs( "s" ) = Group
	  rs( "FileName" ) = FileName
   rs.Update
End Sub 

' ...

addfile FileItem.path, datum, FileItem.Size, File.Name
%>

sen borde du kunna sålla ut unika filnamn så här:

<%
dim sPrev, sCurr, sNex, sFullName
rs.Sort = "FileName asc"
If Not rs.EOF Then rs.MoveFirst
sPrev = ""
sNext = ""
Do While Not rs.EOF
    sCurr = rs("FileName")
    sFullName=rs("FullPath")
    rs.MoveNext
    If Not rs.EOF Then
        sNext = rs("FileName")
        If sCurr <> sPrev And sNext <> sCurr Then
            response.write sFullName & " är en unik bild.<br>"
        End If
        sPrev = sCurr
    Else
        If sCurr <> sPrev Then
            response.write sFullName & " är en unik bild.<br>"
        End If
        Exit Do
    End If
Loop
%>

Nu utgår jag ifrån att du med "kopia" menar att bilderna har samma namn, inte att dom är identiskt lika byte för byte.

Medlem sedan dec. 2000503 inlägg
#3

Tyvärr så är det så att de kan hetta olika saker. Men man borde kunda göra jämnförelsen på createdate.

Medlem sedan juni 20022 599 inlägg
#4

Tyvärr så är det så att de kan hetta olika saker. Men man borde kunda göra jämnförelsen på createdate.

OK. Fast eftersom du ibland använder tidstämpeln i jpeg-headern så blir ju den jämförelsen bara relevant om alla bilder är tagna av samma person. Annars kan dom ju mycket väl ha samma tidsangivelse utan att vara kopior?

Men i så fall borde du kunna behålla din egen kod för addfile och köra så här istället?

<%
dim dPrev, dCurr, dNext, sFullName
rs.Sort = "d asc"
If Not rs.EOF Then rs.MoveFirst
dPrev = DateAdd("yyyy", -1000, Now)
dNext = DateAdd("yyyy", 1000, Now)
Do While Not rs.EOF
    dCurr = rs("d")
    sFullName=rs("n")
    rs.MoveNext
    If Not rs.EOF Then
        dNext = rs("d")
        If dCurr <> dPrev And dNext <> dCurr Then
            response.write sFullName & " är en unik bild.<br>"
        End If
        dPrev = dCurr
    Else
        If dCurr <> dPrev Then
            response.write sFullName & " är en unik bild.<br>"
        End If
        Exit Do
    End If
Loop
%>

.. om bilderna har samma tidstämpel på sekundnivå.

Medlem sedan mars 20015 287 inlägg
#5

Filstorlek?

Medlem sedan juni 20022 599 inlägg
#6

solbulle skrev:

Filstorlek?

Fast två filer kan kan ha samma storlek utan att vara lika. Men visst, jämför man både tidsstämpel och filstorlek så kommer man nog rätt nära sanningen.

Medlem sedan dec. 2000503 inlägg
#7

Den verkar fungera, tackar.

257 ms totalt · 4 externa anrop · v20260731065814-full.2d97a731
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)