#include <boost/filesystem.hpp>
#include <boost/scoped_array.hpp>
#include <fstream>
#include <iomanip>
#include <iostream>
namespace fs = boost::filesystem;
void traverse_directory( const fs::path& p, int fsiz, const char* buf );
void traverse_directory( const fs::path& p, int fsiz, const char* buf ) {
fs::directory_iterator de;
fs::directory_iterator ds( p );
for( fs::directory_iterator p = ds; p != de; ++p ) {
if( fs::is_directory( *p ) ) {
std::cout << "D:" << *p << std::endl;
traverse_directory( (*p).path(), fsiz, buf );
} else {
int nsiz = fs::file_size( (*p).path() );
if( nsiz == fsiz ) {
boost::scoped_array<char> buf2( new char [nsiz] );
{
std::ifstream ifs( (*p).path().generic_string().c_str(), std::ios::in | std::ios::binary );
ifs.read( buf2.get(), nsiz );
}
if( 0 == memcmp( buf, buf2.get(), nsiz ) ) {
std::cout << "same delete : " << *p << std::endl;
fs::remove( *p );
}
//} else {
//std::cout << *p << std::endl;
}
}
}
}
void show_usage() {
std::cout << " ファイルをバイナリで比較して、同じものを削除します" << std::endl;
std::cout << "nulldel [root folder] [compare file]" << std::endl;
}
int main(int argc, char* argv[] ) {
if( argc != 3 ) {
show_usage();
return 1;
}
int fsiz = fs::file_size( argv[2] );
boost::scoped_array<char> buf( new char [ fsiz ] );
{
std::ifstream ifs( argv[2], std::ios::in | std::ios::binary );
ifs.read( buf.get(), fsiz );
}
traverse_directory( argv[1], fsiz, buf.get() );
return 0;
}
2012年4月25日水曜日
boost::filesystem 同一ファイルを削除
画像処理をしていて、空白だけの画像を削除したいと思って作りました。
空白だけの画像ファイルを、どっかにコピーして、そのファイルと同じファイルならディレクトリーをトラバースして削除していきます。シェルスクリプトでも書けるんでしょうけど、C++偏執狂には、こっちの方が処理コストが安い。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿