Jump to content

(Real) DirGetSize failed.


Recommended Posts

Hi Everybody i'm a newbie of Autoit (v.3.2.8.1)

i have wrote 2 script to back-up folders (with Scite v.1.74).

But this one give me trouble...

CODE

;BARRA Progressiva per backup file

$start = IniRead("Backup.ini", "Dimensione", "dimfile", "") ;read the dimension of original file stored into an .ini file

$stop = (DirGetSize($dir_dest)/1024) ;get the dimension of destination (empty)

ProgressOn("Back-Up", "Avanzamento in corso...", "0 %", 180, 300, 16)

Do

sleep(1000) ;refresh 1 second

$i = Round(($stop / $start * 100),0)

ProgressSet( $i, $i & " % - " & Round($stop, 2) & " Mb") ;Update progressbar with % and Mb

$stop = (DirGetSize($dir_dest)/1024) ;chek actual size (HERE IT'S THE TROUBLE)

; MsgBox(0, "dimensione cartella", "Origine: " & $start & @LF & "Destinazione: " & $stop)

Until $stop >= $start

ProgressSet(100 , "Operazione Terminata", "Finito!")

sleep(500)

ProgressOff()

Exit

... i have 1 file to back-up but it's 2Gb and progress window close after few seconds...

i suppose (as MadBoy) because "Windows" reserving the space (i have already read this topic: http://www.autoitscript.com/forum/index.php?showtopic=44485)

and my DirGetSize($dir_dest) reach immediately the scheduled size.. ;)

Does anybody found how to read the correct filled space of destination during the copy? :)

Edited by Martinibianco
Link to comment
Share on other sites

What is stored in $dir_dest, is it a file or a path?

Hi Weaponx..

the command used is: DirCopy ($dir_principale,$dir_backup1,1)

it's a path and to tell the truth more than one (max 3: dir_principale, dir_altro1, dir_altro2)

i have to work with some big files (think to Outlook .pst file, see attached image)

and this is the script that copy files:

(it works but it's a work in progress.. i have to improve routines) :) :

CODE

; Leggo il percorso dei file da Backuppare

$dir_backup1 = IniRead("Backup.ini", "Settings", "dir_backup1", "") ;Percorso Principale su cui archiviare la copia

$dir_backup2 = IniRead("Backup.ini", "Settings", "dir_backup2", "") ;Percorso Locale con copia dei file

$dir_principale = IniRead("Backup.ini", "Settings", "dir_principale", "") ;Percorso che contiene i file principali da salvare

$dir_altro1 = IniRead("Backup.ini", "Settings", "dir_altro1", "") ;Percorso con altri file da salvare

$dir_altro2 = IniRead("Backup.ini", "Settings", "dir_altro2", "") ;Percorso con altri file da salvare

$copia_fatta = 0

$flag = 0

;per "Barra.exe" azzero il controllo

IniWrite("Backup.ini", "Flag", "controllo", "0")

;segno la data del "tentativo" di back-up

IniWrite("Backup.ini", "Ultimo_Run", "tentativo", _Now())

SplashTextOn("Operazioni in corso.", "Controllo i Settaggi.", 250, 100, -1, -1, 32, "Verdana", 8)

Sleep(3000)

;Controllo se ĆØ stata selezionata almeno una cartella d'origine

if $dir_principale = "" And $dir_altro1 = "" And $dir_altro2 = "" then

MsgBox(16, "Attenzione", "Non ĆØ stata selezionata una cartella d'origine." & @LF _

& "Verifica i settaggi del file Backup.ini")

Exit

EndIf

;Controllo se sono state inserite le directory di destinazione del back-up

if $dir_backup1 = "" And $dir_backup2 = "" then

MsgBox(16,"Avviso", "Non sono state inserite le directory" & @LF _

& "Verifica i settaggi del file Backup.ini")

Exit

EndIf

#include <Date.au3> ;Per marcare la data di esecuzione sul file "Backup.ini"

#include <Array.au3> ;Funzione utente per inizializzare una matrice (vedere messaggio finale con _ArrayCreate)

Dim $size_pre1

Dim $size_pre2

Dim $size_post1

Dim $size_post2

Dim $size

;Copia File nella Directory "Locale"

if $dir_backup2 <> "" Then

$risposta = 0 ;Setto la variabile per le risposte

;Controllo cha la cartella "Locale" esista e..

$dir_status = DriveStatus($dir_backup2)

;..se non esiste la creo

if $dir_status = "UNKNOWN" Then

$risposta = MsgBox(35,"Avviso", "La directory " & $dir_backup2 & " non esiste!" & @LF _

& "Devo crearla?")

Select

Case $risposta = 6 ;YES -> Creo directory

DirCreate($dir_backup2)

MsgBox(64,"Avviso", "Ho creato la directory " & $dir_backup2)

Call("Copiaggio2")

$copia_fatta = 1

Case $risposta = 7 ;NO -> Non creo Directory

MsgBox(64,"Avviso", "NON ho creato la directory " & $dir_backup2)

$flag = $flag + 1

Case $risposta = 2 ;Cancel -> Esco dal programma

MsgBox(64,"Avviso", "Termine Programma!")

Exit

EndSelect

EndIf

if $risposta = 0 then Call("Copiaggio2")

EndIf

;Copio i file dalla cartella Locale (se settata) a quella sul Server (se settata)

if $dir_backup1 <> "" Then

$risposta = 0 ;Setto la variabile per le risposte

;Controllo cha la cartella "Remota" esista e..

$dir_status = DriveStatus($dir_backup1)

;..se non esiste la creo

if $dir_status = "UNKNOWN" Then

$risposta = MsgBox(35,"Avviso", "La directory " & $dir_backup1 & " non esiste!" & @LF _

& "Devo crearla?")

Select

Case $risposta = 6 ;YES -> Creo directory

DirCreate($dir_backup1)

MsgBox(64,"Avviso", "Ho creato la directory " & $dir_backup1)

Call("Copiaggio1")

Case $risposta = 7 ;NO -> Non creo Directory

MsgBox(64,"Avviso", "NON ho creato la directory " & $dir_backup1)

$flag = $flag + 1

Case $risposta = 2 ;Cancel -> Esco dal programma

MsgBox(64,"Avviso", "Termine Programma!")

Exit

EndSelect

EndIf

if $risposta = 0 then Call("Copiaggio1")

EndIf

SplashTextOn("Operazioni in corso.", "Aggiorno file .ini", 250, 100, -1, -1, 32, "Verdana", 8)

Sleep(3000)

SplashOff()

;per "Barra.exe" azzero il controllo e segno l'ora del back-up

IniWrite("Backup.ini", "Flag", "controllo", "0")

IniWrite("Backup.ini", "Ultimo_Run", "eseguito", _Now())

; Messaggio che riepiloga la dimensione dei file nella Directory prima e dopo il Back-Up (la routine lavora in modo da

;leggere la dimensione delle destinazioni solo 1 volta.. vedere funzioni call a fine listato)

If $flag <> 2 Then

;Converto i valori archiviati nelle variabili circa i contenuti e le dimensioni delle directory di destinazione

If $size_pre1 = "" Then $size_pre1 = _ArrayCreate(0, 0, 0)

If $size_pre2 = "" Then $size_pre2 = _ArrayCreate(0, 0, 0)

If $size_post1 = "" Then $size_post1 = _ArrayCreate(0, 0, 0)

If $size_post2 = "" Then $size_post2 = _ArrayCreate(0, 0, 0)

MsgBox(64, "Info", "Back-Up Terminato." & @LF & @LF _

& "Directory Sorgenti: " & @LF _

& $dir_principale & @LF _

& $dir_altro1 & @LF _

& $dir_altro2 & @LF & @LF _

& "Dati Prima del Back-up:" & @LF _

& "Sub-Directory nr.: " & $size_pre1[2] + $size_pre2[2] & @LF _

& "Nr. file contenuti: " & $size_pre1[1] + $size_pre2[1] & @LF _

& "Dimensione totale directory (Gb): " & Round(($size_pre1[0]/1024/1024/1000) + ($size_pre2[0]/1024/1024/1000),2) & @LF _

& @LF & "-----------------------" & @LF _

& "Directory di Destinazione: " & @LF _

& $dir_backup1 & @LF _

& $dir_backup2 & @LF & @LF _

& "Dati Dopo il Back-up:" & @LF _

& "Sub-Directory nr.: " & $size_post1[2] + $size_post2[2] & @LF _

& "Nr. file salvati: " & $size_post1[1] + $size_post2[1] & @LF _

& "Dimensione totale directory (Gb): " & Round(($size_post1[0]/1024/1024/1000) + ($size_post2[0]/1024/1024/1000),2))

Else

MsgBox(64,"Avviso", "Non sono state inserite le directory" & @LF _

& "per l'archiviazione dei dati. Back-up non eseguito.")

EndIf

Exit

Func Recuperadimensione()

; Recupero le informazioni sulla dimensione dei file nelle direcory del back-up e lo scrivo nel Backup.ini

$size = 0

if $dir_principale <> "" then $size = $size + DirGetSize($dir_principale)

if $dir_altro1 <> "" then $size = $size + DirGetSize($dir_altro1)

if $dir_altro2 <> "" then $size = $size + DirGetSize($dir_altro2)

$size = ($size/1024/1024)

IniWrite("Backup.ini", "Dimensione", "dimfile", $size)

EndFunc

Func Copiaggio2()

SplashTextOn("Operazioni in corso.", "Recupero la dimensione dei File" & @LF & "di cui fare il back-up", 250, 100, -1, -1, 32, "Verdana", 8)

Sleep(3000)

; Recupero le informazioni sulla dimensione dei file nelle direcory del back-up e lo scrivo nel Backup.ini

Recuperadimensione()

;Vuoto la directory

SvuotaCartella($dir_backup2)

SplashTextOn("Operazioni in corso.", "Copio File in " & @LF & $dir_backup2, 250, 100, -1, -1, 32, "Verdana", 8)

Sleep(3000)

;per "Barra.exe" memorizzo di quale back-up (Locale) deve segnalare la %

IniWrite("Backup.ini", "Flag", "controllo", "2")

Run("Barra.exe")

if $dir_principale <> "" Then

DirCopy ($dir_principale,$dir_backup2,1) ;Sovrascrivo i file

EndIf

if $dir_altro1 <> "" Then

DirCopy ($dir_altro1,$dir_backup2,1) ;Sovrascrivo i file

EndIf

if $dir_altro2 <> "" Then

DirCopy ($dir_altro2,$dir_backup2,1) ;Sovrascrivo i file

EndIf

; Recupero le nuove informazioni sui file della directory dopo il back-up secondario

$size_post2 = DirGetSize($dir_backup2,1)

EndFunc

Func Copiaggio1()

SplashTextOn("Operazioni in corso.", "Recupero la dimensione dei File" & @LF & "di cui fare il back-up", 250, 100, -1, -1, 32, "Verdana", 8)

Sleep(3000)

; Recupero le informazioni sulla dimensione dei file nelle direcory del back-up e lo scrivo nel Backup.ini

Recuperadimensione()

;Vuoto la directory

SvuotaCartella($dir_backup1)

SplashTextOn("Operazioni in corso.", "Copio File in " & @LF & $dir_backup1, 250, 100, -1, -1, 32, "Verdana", 8)

Sleep(3000)

;per "Barra.exe" memorizzo di quale back-up (Server) deve segnalare la %

IniWrite("Backup.ini", "Flag", "controllo", "1")

Run("Barra.exe")

;Se ho giĆ  fatto una copia in una cartella "Locale" uso questa come sorgente...

if $copia_fatta=1 then

DirCopy($dir_backup2,$dir_backup1,1) ;Sovrascrivo i file con lo stesso nome

Else

;altrimenti prendo i file dalle cartelle originali

if $dir_principale <> "" Then

DirCopy ($dir_principale,$dir_backup1,1) ;Sovrascrivo i file

EndIf

if $dir_altro1 <> "" Then

DirCopy ($dir_altro1,$dir_backup1,1) ;Sovrascrivo i file

EndIf

if $dir_altro2 <> "" Then

DirCopy ($dir_altro2,$dir_backup1,1) ;Sovrascrivo i file

EndIf

; Recupero le nuove informazioni sui file della directory dopo il back-up principale

$size_post1 = DirGetSize($dir_backup1,1)

EndIf

EndFunc

Func SvuotaCartella($folder)

SplashTextOn("Operazioni in corso.", "Cancello File nella directory " & @LF & $folder, 250, 100, -1, -1, 32, "Verdana", 8)

Sleep(3000)

;Thanks to 'Pixel75'

Local $search, $file, $attrib

$search = FileFindFirstFile($folder & "\*.*")

If $search <> -1 Then

While 1

$file = FileFindNextFile($search)

If @error Then ExitLoop

$attrib = FileGetAttrib($folder & "\" & $file)

If StringInStr($attrib, "D") Then

DirRemove($folder & "\" & $file, 1)

Else

FileDelete($folder & "\" & $file)

EndIf

Wend

EndIf

EndFunc

and this is the .ini file where i store the informations:

CODE
; Settaggio delle directory per il backup dei dati

[settings]

;Percorso Principale che contiene i file da salvare

dir_principale = "D:\Posta"

;Percorso 1 aggiuntivo con altri file da salvare

dir_altro1 = ""

;Percorso 2 aggiuntivo con altri file da salvare

dir_altro2 = ""

;Percorso 1 su cui archiviare la copia dei file (meglio Server)

dir_backup1 = "\\Srv2003\studio m\OE Backup\Temp"

;Percorso 2 su cui fare una ulteriore copia dei file (meglio Locale)

dir_backup2 = "C:\Posta"

;Flag per la barra progressiva

[Flag]

controllo =0

;Dimensione dei file salvati in Mb

[Dimensione]

dimfile =23.9227409362793

;Date di riferimento

[ultimo_Run]

tentativo =12/10/2007 20.04.28

eseguito =12/10/2007 20.05.07

and the script of Progress Bar (Barra.exe):

CODE

;BARRA Progressiva per backup file

$FlagGlobale = IniRead("Backup.ini", "Flag", "Controllo", "0") ;directory origine

Select

Case $FlagGlobale = 0 ;nessun valore -> fine

MsgBox(16,"Attenzione", "Per il Back-Up bisogna eseguire Backup.exe" & @LF _

& "Barra.exe serve per visualizzare la barra % progressiva.")

Exit

Case $FlagGlobale = 1 ;back-up 1 (principale, server)

$dir_dest = IniRead("Backup.ini", "Settings", "dir_backup1", "") ;directory destinazione

Case $FlagGlobale = 2 ;back-up 2 (secondario, locale)

$dir_dest = IniRead("Backup.ini", "Settings", "dir_backup2", "") ;directory destinazione

EndSelect

$start = IniRead("Backup.ini", "Dimensione", "dimfile", "") ;dimensione origine

$stop = (DirGetSize($dir_dest)/1024) ;dimensione destinazione

ProgressOn("Back-Up", "Avanzamento in corso...", "0 %", 180, 300, 16)

Do

sleep(1000) ;refresh ogni 1 secondi

$i = Round(($stop / $start * 100),0)

ProgressSet( $i, $i & " % - " & Round($stop, 2) & " Mb") ;Aggiorno la barra progressiva con % e Mb

$stop = (DirGetSize($dir_dest)/1024) ;ri-controllo la dimensione della destinazione

; MsgBox(0, "dimensione cartella", "Origine: " & $start & @LF & "Destinazione: " & $stop)

Until $stop >= $start

ProgressSet(100 , "Operazione Terminata", "Finito!")

sleep(500)

ProgressOff()

Exit

Please be patient about mistakes.. :">

post-28038-1192437673_thumb.jpg

Link to comment
Share on other sites

I have also had issues with dirgetsize and lotus notes copying.

I've found that a combination of the file modification date and the file size is a good way to watch the file progress.

Basically, you poll the file size and modification date every X seconds, and determined if there's a change. Running both helps ensure if one gets caught up you have another net to catch on to.

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...