back-up programma
Het mooiste zou zijn als het programma bestanden kan kopiëren vanuit de "bron" folder naar de back-up folder. En dan op zo'n manier dat uitsluitend de bestanden worden gekopieerd/overschreven die op de computer nieuw zijn aangemaakt of gewijzigd (obv het 'laatst gewijzigd' tijdstip). Bestanden die al op de externe harde schijf staan en die niet gewijzigd zijn op de computer, hoeven niet overschreven te worden. Dus uitsluitend nieuwe en aangepaste bestanden worden naar de harde schijf gekopieerd. En oh ja, bestanden die op de computer verwijderd zijn, moeten op de harde schijf dan ook worden verwijderd. Het resultaat is dus dat de back-up map op de harde schijf een exacte "kloon" wordt van de map op de computer.
Het gaat echt om een kopie van bestanden en niet om een image van de harde schijf. Wie weet hier een handig programmaatje voor?
Tips zijn welkom.
Met Google Drive en Microsoft OneDrive kun je automatisch een directory synchroniseren met een kopie in de cloud.
Thanks Ward, maar ik zoek geen cloud-oplossing. Het gaat echt om een lokale back-up van computer naar externe harde schijf waarbij de map op de harde schijf dus wordt gesynchroniseerd met de map op de computer zodat ik een back-up heb.
Waarschuwing van mijn kant:
De oplossing die je zoekt biedt geen oplossing bij diefstal, brand- en waterschade. Ik hoop dat je je hiervan bewust bent.
Raid ken ik, maar is ook op dit moment niet wat ik zoek :)
Ik zoek gewoon een progje waarmee ik handig een back-up kan maken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
set_error_handler(function($number,$message,$filename,$line){
throw new \Exception("$message ($filename:$line)",$number);
});
class Backup{
public $exclude = [];
public $infoDirTime = 30;
public $maxErrors = 10;
public $dirs = 0;
public $files = 0;
public $bytes = 0;
public $copied = 0;
public $deleted = 0;
public $errors = 0;
protected $_sourceDir = null;
protected $_targetDir = null;
protected $_registerDir = null;
protected $_archiveDir = null;
protected $_start = null;
public function __construct($source_dir,$target_dir,$archive_dir){
$this->_sourceDir = $source_dir;
$this->_targetDir = $target_dir;
$this->_archiveDir = $archive_dir;
$this->_start = time();
}
protected function escape($filename){
return escapeshellarg(str_replace('/','\\',$filename));
}
protected function archive($filename){
if(!is_dir($archive_dir = dirname($archive_filename = $this->_archiveDir . date('/Y/m/d/') . $filename))) mkdir($archive_dir,0777,true);
return rename($this->_targetDir . $filename,$archive_filename);
}
public function syncDir($path = null){
$this->dirs++;
$start = time();
if(!is_dir($target_dir = $this->_targetDir . $path)) mkdir($target_dir,0777,true);
$filenames = [];
$dir = dir($this->_sourceDir . $path);
while($filename = $dir->read()) if(trim($filenames[] = $filename,'.')){
$filename = $path . '/' . $filename;
foreach($this->exclude as $filter) if(preg_match($filter,$filename)) continue 2;
if($path && $start && (time() - $start > $this->infoDirTime)){
print("\r" . substr(str_pad(date('H:i ') . $path,79),0,79) . "\n");
$start = null;
}
if(is_dir($this->_sourceDir . $filename)) $this->syncDir($filename);
else try{
$this->files++;
$time = filemtime($source_filename = $this->_sourceDir . $filename);
$this->bytes += ($size = filesize($source_filename));
if(!($target_exists = is_file($target_filename = $this->_targetDir . $filename)) || ($time != filemtime($target_filename)) || ($size != filesize($target_filename))){
if($target_exists) $this->archive($filename);
if($size >= 2147483648) exec('copy ' . $this->escape($source_filename) . ' ' . $this->escape($target_filename));
elseif(copy($source_filename,$target_filename)) touch($target_filename,$time);
print(chr(8) . ['/','-','\\','|'][$this->copied++ % 4]);
}
}
catch(\Exception $e){
print("\nError: $filename: " . $e->getMessage() . ' (' . $e->getFile() . ':' . $e->getLine() . ")\n");
if(++$this->errors >= $this->maxErrors) exit('Too many errors');
}
}
$dir->close();
$dir = dir($this->_targetDir . $path);
while($filename = $dir->read()) if(trim($filename,'.') && !in_array($filename,$filenames) && $this->archive($path . '/' . $filename)) $this->deleted++;
$dir->close();
$value = $this->bytes;
$unit = null;
$units = ['k','M','G','T'];
while($units && ($value > 1024)){
$unit = array_shift($units);
$value /= 1024;
}
$value = number_format($value,$unit ? ($value >= 100 ? 1 : 2) : 0);
print("\rDir:{$this->dirs} File:{$this->files} Byte:$value$unit Copy:{$this->copied} Del:{$this->deleted} " . gmdate('H:i:s',time() - $this->_start) . ' ');
}
}
?>
set_error_handler(function($number,$message,$filename,$line){
throw new \Exception("$message ($filename:$line)",$number);
});
class Backup{
public $exclude = [];
public $infoDirTime = 30;
public $maxErrors = 10;
public $dirs = 0;
public $files = 0;
public $bytes = 0;
public $copied = 0;
public $deleted = 0;
public $errors = 0;
protected $_sourceDir = null;
protected $_targetDir = null;
protected $_registerDir = null;
protected $_archiveDir = null;
protected $_start = null;
public function __construct($source_dir,$target_dir,$archive_dir){
$this->_sourceDir = $source_dir;
$this->_targetDir = $target_dir;
$this->_archiveDir = $archive_dir;
$this->_start = time();
}
protected function escape($filename){
return escapeshellarg(str_replace('/','\\',$filename));
}
protected function archive($filename){
if(!is_dir($archive_dir = dirname($archive_filename = $this->_archiveDir . date('/Y/m/d/') . $filename))) mkdir($archive_dir,0777,true);
return rename($this->_targetDir . $filename,$archive_filename);
}
public function syncDir($path = null){
$this->dirs++;
$start = time();
if(!is_dir($target_dir = $this->_targetDir . $path)) mkdir($target_dir,0777,true);
$filenames = [];
$dir = dir($this->_sourceDir . $path);
while($filename = $dir->read()) if(trim($filenames[] = $filename,'.')){
$filename = $path . '/' . $filename;
foreach($this->exclude as $filter) if(preg_match($filter,$filename)) continue 2;
if($path && $start && (time() - $start > $this->infoDirTime)){
print("\r" . substr(str_pad(date('H:i ') . $path,79),0,79) . "\n");
$start = null;
}
if(is_dir($this->_sourceDir . $filename)) $this->syncDir($filename);
else try{
$this->files++;
$time = filemtime($source_filename = $this->_sourceDir . $filename);
$this->bytes += ($size = filesize($source_filename));
if(!($target_exists = is_file($target_filename = $this->_targetDir . $filename)) || ($time != filemtime($target_filename)) || ($size != filesize($target_filename))){
if($target_exists) $this->archive($filename);
if($size >= 2147483648) exec('copy ' . $this->escape($source_filename) . ' ' . $this->escape($target_filename));
elseif(copy($source_filename,$target_filename)) touch($target_filename,$time);
print(chr(8) . ['/','-','\\','|'][$this->copied++ % 4]);
}
}
catch(\Exception $e){
print("\nError: $filename: " . $e->getMessage() . ' (' . $e->getFile() . ':' . $e->getLine() . ")\n");
if(++$this->errors >= $this->maxErrors) exit('Too many errors');
}
}
$dir->close();
$dir = dir($this->_targetDir . $path);
while($filename = $dir->read()) if(trim($filename,'.') && !in_array($filename,$filenames) && $this->archive($path . '/' . $filename)) $this->deleted++;
$dir->close();
$value = $this->bytes;
$unit = null;
$units = ['k','M','G','T'];
while($units && ($value > 1024)){
$unit = array_shift($units);
$value /= 1024;
}
$value = number_format($value,$unit ? ($value >= 100 ? 1 : 2) : 0);
print("\rDir:{$this->dirs} File:{$this->files} Byte:$value$unit Copy:{$this->copied} Del:{$this->deleted} " . gmdate('H:i:s',time() - $this->_start) . ' ');
}
}
?>
En dan bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$backup = new Backup('V:','F:/backup/server','F:/backup/archive/server');
$backup->exclude = [
'/\\/temp$/',
'/\\.te?mp$/',
'/\\/cache$/',
'/\\/logs?$/',
'/\\/minified$/',
'/\\/Thumbs.db$/'
];
$backup->syncDir();
?>
$backup = new Backup('V:','F:/backup/server','F:/backup/archive/server');
$backup->exclude = [
'/\\/temp$/',
'/\\.te?mp$/',
'/\\/cache$/',
'/\\/logs?$/',
'/\\/minified$/',
'/\\/Thumbs.db$/'
];
$backup->syncDir();
?>
Gewijzigd op 11/12/2019 23:11:29 door Rob Doemaarwat
@Rob ... uhm ... is dit om vanaf de server iets te kopiëren? Ik zoek gewoon een .exe programmaatje om lokaal op m'n computer iets te kunnen kopiëren :)
Mijn code
Doet exact wat je wilt
parameters
d enkel indien veranderd of nieuw
s submappen
e ook lege mappen
c negeer fouten en doe verder
h ook verborgen bestanden
r overschijf RO bestanden
y standaard Yes op antwoord
dit verwijderd wel niet de bestaande bestanden.
Je hebt ook synctoy van MS ook gratis na configuratie een 4tal kliks om te starten
Gewijzigd op 12/12/2019 07:19:52 door Jan R
Gewijzigd op 12/12/2019 08:38:11 door PHP ir
- Je kunt eenvoudig bestanden/directories uitsluiten (bijvoorbeeld cache en versiebeheer directories - daar staat xcopy anders zo'n enorme tijd in te graven, en ik hoef toch geen backup van m'n cache map).
- Doet meteen aan een soort versiebeheer (oude versie van bestanden terug kunnen vinden). Niet elke wijziging is altijd "bewust", maar met xcopy overschrijf je altijd de vorige versie (als je dagelijks een backup maakt dus meteen "die van gisteren"). Door de oude versies in een aparte map te bewaren kan ik altijd nog terug (kijken) naar een vorige versie. Ik sla dit in een mappenstructuur met jaar/maand/dag op, dus na een tijdje gooi ik gewoon de map van "2 jaar terug" volledig weg.
En zoals je zelf al aangeeft: nadeel van xcopy is dat verwijderde bestanden niet uit de backup worden verwijderd.
Ik gebruik zelf fbackup. Maakt automatisch iedere week een backup voor mij, overschrijft de oude backup.
Thanks voor jullie reacties. Misschien is dat fbackup iets. Zal zelf ook nog verder zoeken.
Je hebt trouwens ook nog bestandsgeschiedenis van Windows zelf. Ik dacht sinds versie 7. Ik doe dit naar mijn nas. geen omkijken naar en ook versiegeschiedenis. of kan ook naar een andere (externe) hdd
"Je hebt trouwens ook nog bestandsgeschiedenis van Windows zelf."
Dat ken ik niet. Waar vind je dat? Heb je meer uitleg?
Thanks ... soort versiebeheer dus. Kende ik niet. Niet wat ik zocht, maar wel grappig.
dergelijke software wordt ook wel meegeleverd met externe schijven of NASsen.