Jump to content

Size Comparison


 Share

Recommended Posts

Hey guys,

I have a folder full of ~5000 files and I would like to delete files out of there. I want to delete every file which is there twice or more often (not one left over, all should be gone) and the ones who are there just once should stay. The problem is, they have different names but the exact size is unique. So I thought about deleting the files with same sizes which appear more than once. Can you throw me some keywords to look out for in the helpfile? I'm basically just done with the "Hello World" so, please include basic keywords :) thank you!

Link to comment
Share on other sites

FileListToArray and FileGetSize

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

Have a look at: 

 

FileGetSize

in the helpfile. 

Edit: to slow

Edited by MikahS

Snips & Scripts


My Snips: graphCPUTemp ~ getENVvars
My Scripts: Short-Order Encrypter - message and file encryption V1.6.1 ~ AuPad - Notepad written entirely in AutoIt V1.9.4

Feel free to use any of my code for your own use.                                                                                                                                                           Forum FAQ

 

Link to comment
Share on other sites

 

#include <Array.au3>
#include <File.au3>
#include <MsgBoxConstants.au3>


Func Example()
    ; List all the files and folders in the desktop directory using the default parameters.
    $aFileList = _FileListToArray("D:\Musik - Kopie","*",)
    If @error = 1 Then
        MsgBox($MB_SYSTEMMODAL, "", "Path was invalid.")
        Exit
    EndIf
    If @error = 4 Then
        MsgBox($MB_SYSTEMMODAL, "", "No file(s) were found.")
        Exit
    EndIf
EndFunc

Func Example1()
    ; Retrieve the file size (in bytes) of the AutoIt executable.
    $iFileSize = FileGetSize($aFileList[1])

    ; Display the file size and convert to a readable form.
    MsgBox($MB_SYSTEMMODAL, "", ByteSuffix($iFileSize))
EndFunc   ;==>Example

 

Why doesn't this give me the size of the first file of the array? It does nothing, no error etc

Edited by Siryx
Link to comment
Share on other sites

it gives me error at line 71 .. I only have 27.. I have no idea

 

wrong.png

is that caused by the file.au3 file? or did i make a mistake

€: comma too much

now I get variable not declared error;

isn't 

    $iFileSize = FileGetSize($aFileList[1])
 
supposed to be first of the array ?
Edited by Siryx
Link to comment
Share on other sites

You have a bad syntax here : $aFileList = _FileListToArray("D:\Musik - Kopie","*",) < The comma is the problem

You can try with this kind of code :

Local $sPath = "D:\Musik - Kopie"
Local $hSearch = FileFindFirstFile($sPath & "\*.*")
If $hSearch = -1 Then Exit

Local $sSizes = ";"

While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then ContinueLoop
    
    $iSize = FileGetSize($sPath & "\" & $sFile)
    If StringInStr($sSizes, ";" & $iSize & ";") Then
        FileDelete($sPath & "\" & $sFile)
    Else
        $sSizes &= $iSize & ";"
    EndIf
WEnd
FileClose($hSearch)

 

Edited by jguinch
Correcting wrong code
Link to comment
Share on other sites

Remove that trailing comma after "*" and you will see the error disappear.

Edited by guinness

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

$sSizes is nothing until it is set to some concatenate size values (in the Else step)
At the beginning, the variable is empty, but each uniq size is added to it, with a ";" as separator.
For each file size, I search in this variable if the value <size>; exists.

In fact, my code is wrong. To work, $sSizes should be set to ";" at the beginning and the search must operate with ;<filesize>;

I edit my code now...

Link to comment
Share on other sites

$sSizes is nothing until it is set to some concatenate size values (in the Else step)
At the beginning, the variable is empty, but each uniq size is added to it, with a ";" as separator.
For each file size, I search in this variable if the value <size>; exists.

In fact, my code is wrong. To work, $sSizes should be set to ";" at the beginning and the search must operate with ;<filesize>;

I edit my code now...

​okay I tried it and it leaves one file behind.. but I think I understood so far

Link to comment
Share on other sites

$aFileList[1] is supposed to be the first file.

But I see in your code that the $aFileList is not declared as a global variable. Try to declare it before calling the function :

Global $aFileList

Link to comment
Share on other sites

$aFileList[1] is supposed to be the first file.

But I see in your code that the $aFileList is not declared as a global variable. Try to declare it before calling the function :

Global $aFileList

​oh now I understand what Local and Global are for!

it gives me 0 .. damn

Edited by Siryx
Link to comment
Share on other sites

 

#include <File.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>

Global $aFileList
Global $iFileSize

Listing()
Func Listing()
    ; List all the files and folders in the desktop directory using the default parameters.
    $aFileList = _FileListToArray("D:\Musik - Kopie")
    If @error = 1 Then                      ;Kills when directory doesnt exist
        MsgBox($MB_SYSTEMMODAL, "", "Path was invalid.")
        Exit
    EndIf
    If @error = 4 Then                      ;Kills when folder is empty
        MsgBox($MB_SYSTEMMODAL, "", "No file(s) were found.")
        Exit
    EndIf
EndFunc

Retrieving()
Func Retrieving()
    ; Retrieve the file size of $aFileList
    $iFileSize = FileGetSize($aFileList[1])
    ; Display the file size
    MsgBox($MB_SYSTEMMODAL, "",$iFileSize)
EndFunc

_ArrayDisplay($aFileList)

this is it im just playing around and trying to understand arrays... I'm also trying to understand what you need to do to your code, what effect the ; has

when i want to make a loop, how can i change the 1 in 

$aFileList[1]
Edited by Siryx
Link to comment
Share on other sites

In your case, FileGetSize($aFileList[1]) returns 0 because only the filenames are returned in your _FileListToArray call.

You have to work with the full name to use FileGetSize, either by using True in the $bReturnPath parameter of _FileListToArray, or use something like FileGetSize("D:\Musik - Kopie\" & $aFileList[1])

Link to comment
Share on other sites

Local $sPath = "D:\Musik - Kopie2" ;searchpath 
Local $hSearch = FileFindFirstFile($sPath & "\*.*") ;starts the searching and gives out name of the file
If $hSearch = -1 Then Exit ;no files kills scripts - rip

Local $sSizes   ;defining of variable

While 1                                             ;starts the loop to search for files
    $sFile = FileFindNextFile($hSearch)             ;variable with filename
    If @error Then ExitLoop                         ;kills when no files
    If @extended Then ContinueLoop                  ;goes on when found

    $iSize = FileGetSize($sPath & "\" & $sFile)     ;gets the size from the file with the data from line 8
    If StringInStr($sSizes, $iSize & ";") Then      ;
        FileDelete($sPath & "\" & $sFile)           ;deletes file when sizes are the same  
    Else                                            
        $sSizes &= $iSize & ";"                     ;if not the same then sizes is the first size and ; behind it
    EndIf                                           ;if now sizes and size are the same stringinstr will trigger and delete 2nd file
WEnd
FileClose($hSearch)

this is how far I understood your script, I think I'll try to do something like this because I don't understand arrays..

Link to comment
Share on other sites

In your case, FileGetSize($aFileList[1]) returns 0 because only the filenames are returned in your _FileListToArray call.

You have to work with the full name to use FileGetSize, either by using True in the $bReturnPath parameter of _FileListToArray, or use something like FileGetSize("D:\Musik - Kopie\" & $aFileList[1])

#include <File.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>

Global $aFileList
Global $iFileSize

Listing()
Func Listing()
    ; List all the files and folders in the desktop directory using the default parameters.
    $aFileList = _FileListToArray("D:\Musik - Kopie","*",1,True)
    If @error = 1 Then                      ;Kills when directory doesnt exist
        MsgBox($MB_SYSTEMMODAL, "", "Path was invalid.")
        Exit
    EndIf
    If @error = 4 Then                      ;Kills when folder is empty
        MsgBox($MB_SYSTEMMODAL, "", "No file(s) were found.")
        Exit
    EndIf
EndFunc

Retrieving()
Func Retrieving()
    ; Retrieve the file size of $aFileList
    $iFileSize = FileGetSize($aFileList[1])
    ; Display the file size
    MsgBox($MB_SYSTEMMODAL, "",$iFileSize)
EndFunc

_ArrayDisplay($aFileList)

works! atleast it gives me the bytes so thats step one.. but would you mind explaining me how you would change the code you wrote? with the ";", I didn't quite understood

$sSizes is nothing until it is set to some concatenate size values (in the Else step)
At the beginning, the variable is empty, but each uniq size is added to it, with a ";" as separator.
For each file size, I search in this variable if the value <size>; exists.

In fact, my code is wrong. To work, $sSizes should be set to ";" at the beginning and the search must operate with ;<filesize>;

I edit my code now...

I tried your code out and it deleted everything I wanted but one of the files (when there where 2 / 3 / n it left one behind )

Edited by Siryx
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...