forked from pauldreik/rdfind
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Rdutil.hh
126 lines (103 loc) · 3.49 KB
/
Rdutil.hh
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
copyright 20016-2017 Paul Dreik (earlier Paul Sundvall)
Distributed under GPL v 2.0 or later, at your option.
See LICENSE for further details.
this file contains functions and templates that implement most of the
functionality in rdfind.
*/
#ifndef rdutil_hh
#define rdutil_hh
#include <vector>
#include "Fileinfo.hh" //file container
class Rdutil
{
public:
explicit Rdutil(std::vector<Fileinfo>& list)
: m_list(list){};
/**
* print file names to a file, with extra information.
* @param filename
* @return zero on success
*/
int printtofile(const std::string& filename) const;
/// mark files with a unique number
void markitems();
/**
* sorts the list on device and inode. not guaranteed to be stable.
* @return
*/
int sortOnDeviceAndInode();
/**
* sorts from the given index to the end on depth, then name.
* this is useful to be independent of the filesystem order.
*/
void sort_on_depth_and_name(std::size_t index_of_first);
/**
* for each group of identical inodes, only keep the one with the highest
* rank.
* @return number of elements removed
*/
std::size_t removeIdenticalInodes();
/**
* remove files with unique size from the list.
* @return
*/
std::size_t removeUniqueSizes();
/**
* remove files with unique combination of size and buffer from the list.
* @return
*/
std::size_t removeUniqSizeAndBuffer();
/**
* Assumes the list is already sorted on size, and all elements with the same
* size have the same buffer. Marks duplicates with tags, depending on their
* nature. Shall be used when everything is done, and sorted.
* For each sequence of duplicates, the original will be placed first but no
* other guarantee on ordering is given.
*
*/
void markduplicates();
/// removes all items from the list, that have the deleteflag set to true.
std::size_t cleanup();
/**
* Removes items with file size less than minsize
* @return the number of removed elements.
*/
std::size_t remove_small_files(Fileinfo::filesizetype minsize);
// read some bytes. note! destroys the order of the list.
// if lasttype is supplied, it does not reread files if they are shorter
// than the file length. (unnecessary!). if -1, feature is turned off.
// and file is read anyway.
// if there is trouble with too much disk reading, sleeping for nsecsleep
// nanoseconds can be made between each file.
int fillwithbytes(enum Fileinfo::readtobuffermode type,
enum Fileinfo::readtobuffermode lasttype =
Fileinfo::readtobuffermode::NOT_DEFINED,
long nsecsleep = 0);
/// make symlinks of duplicates.
std::size_t makesymlinks(bool dryrun) const;
/// make hardlinks of duplicates.
std::size_t makehardlinks(bool dryrun) const;
/// delete duplicates from file system.
std::size_t deleteduplicates(bool dryrun) const;
/**
* gets the total size, in bytes.
* @param opmode 0 just add everything, 1 only elements with
* m_duptype=Fileinfo::DUPTYPE_FIRST_OCCURRENCE
* @return
*/
Fileinfo::filesizetype totalsizeinbytes(int opmode = 0) const;
/**
* outputs a nicely formatted string "45 bytes" or "3 Gibytes"
* where 1024 is used as base
* @param out
* @param opmode
* @return
*/
std::ostream& totalsize(std::ostream& out, int opmode = 0) const;
/// outputs the saveable amount of space
std::ostream& saveablespace(std::ostream& out) const;
private:
std::vector<Fileinfo>& m_list;
};
#endif