initial commit
This commit is contained in:
commit
d8c21c3650
|
|
@ -0,0 +1,10 @@
|
|||
nullblocks
|
||||
---
|
||||
Scan a file for contiguous blocks of 'null' bytes.
|
||||
|
||||
Usage:
|
||||
```bash
|
||||
nullblocks <file>
|
||||
```
|
||||
The default minimum block size to be reported is 8192 bytes. Maybe this will
|
||||
be adjustable as a command line argument in the future...
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
|
||||
const long IO_BUFFSIZE=(long)1024*1024; // read 1 KiB at a time
|
||||
const long MIN_NULL_BLOCK_SIZE=(long)8*1024; // minimum number of consecutive NULL bytes
|
||||
|
||||
int main(int argc,char *argv[]){
|
||||
int ifile, iblock;
|
||||
char* buffer = new char[IO_BUFFSIZE];
|
||||
long filesize, iosize, nullblock_len, nullblock_beg;
|
||||
|
||||
cout << "Checking files for NULL blocks (threshold: "
|
||||
<< MIN_NULL_BLOCK_SIZE << " bytes)" << endl;
|
||||
string filename;
|
||||
|
||||
for(ifile=1;ifile<argc;ifile++){
|
||||
filename = argv[ifile];
|
||||
ifstream file(filename,ios::in|ios::binary|ios::ate);
|
||||
if(!file)
|
||||
cerr << "Cannot open file: " << filename << endl;
|
||||
filesize = (long)file.tellg();
|
||||
file.seekg(0,ios::beg);
|
||||
cout << filename << " (" << filesize << " bytes)" << endl;
|
||||
|
||||
iblock=0;
|
||||
nullblock_beg=0;
|
||||
nullblock_len=0;
|
||||
bool trunc = false;
|
||||
while(!trunc){
|
||||
trunc = (filesize-iblock*IO_BUFFSIZE)<IO_BUFFSIZE;
|
||||
if(trunc)
|
||||
iosize = filesize-iblock*IO_BUFFSIZE;
|
||||
else
|
||||
iosize = IO_BUFFSIZE;
|
||||
file.read(buffer,iosize);
|
||||
if(file.fail()){
|
||||
cerr << "I/O Error: " << filename << " @ " << file.tellg() << endl;
|
||||
break;
|
||||
}
|
||||
for(int ii=0;ii<iosize;ii++){
|
||||
if((int)buffer[ii]==0){
|
||||
if(nullblock_beg==0){
|
||||
nullblock_beg = iblock*IO_BUFFSIZE+ii;
|
||||
}
|
||||
nullblock_len++;
|
||||
}
|
||||
else{
|
||||
if(nullblock_len>=MIN_NULL_BLOCK_SIZE){
|
||||
cout << "NULL block: position = " << setw(16) << nullblock_beg
|
||||
<< ", size = " << setw(16) << nullblock_len << endl;
|
||||
}
|
||||
nullblock_len = 0;
|
||||
nullblock_beg = 0;
|
||||
}
|
||||
}
|
||||
iblock++;
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
delete[] buffer;
|
||||
|
||||
return 0;
|
||||
}
|
||||
Loading…
Reference in New Issue