📄 a_tree.cpp
字号:
/* Copyright is licensed under GNU LGPL. by I.J.Wang 2005 Dump the directory in tree-like manner Build: a_tree*/#include "../src/wy_dirfile.h"#include "../src/wyfilestat.h"#include "../src/wy_lnkfile.h"#include "../src/wy_uty.h"// dirpath= pathname of directory to traverse// phdr = header to print found filename of the directory//static WyRet traverse(const WyStr& dirpath, const WyStr& phdr)try { WyRet r; Wy_DirFile dirf; if((r=dirf.reset(dirpath))!=Ok) { if(r==Wym_EACCES) { Wy::cout << phdr << "(Error: Access denied)\n"; return(Ok); } WY_RETURN(r); } for(;;) { WyDirEnt dent; if((r=dirf.read(dent))!=Ok) { WY_THROW(r); } if(dent.is_default()) { return(Ok); // No more entry } const WyStr FileName(dent.dt_name()); const WyStr SubPath( dirpath+'/'+FileName ); WyFileStat stt; if((r=Wy::lstat(SubPath,stt))!=Ok) { WY_HERE(r); Wy::cerr << SubPath << " " << Wy::wrd(r) << '\n'; continue; } Wy::cout << phdr << "+-> " << FileName; if(stt.is_lnk()==true) { Wy_LnkFile lnkf(SubPath); WyStr value; if((r=lnkf.read(value))!=Ok) { Wy::cout << " (link read failure: " << Wy::wrd(r) << '\n'; } else { Wy::cout << " (link to " << value << ", traverse ignored)\n"; } } else if(stt.is_dir()==true) { Wy::cout << '\n'; if((FileName==".")||(FileName=="..")) { continue; } if((r=traverse(SubPath, phdr+"| "))!=Ok) { return(r); } } else { Wy::cout << '\n'; } } // UNREACHABLE}catch(const Wy_DirFile::Reply& e) { WY_RETURN(e);}catch(const Wy_LnkFile::Reply& e) { WY_RETURN(e);}catch(const WyStr::Reply& e) { WY_RETURN(e);}catch(const WyByteFlow::Reply& e) { WY_RETURN(e);}catch(const WyRet& e) { WY_TERMINATE("unexpected Reply");}catch(...) { WY_TERMINATE("unknown throw type");};static const char* syntax= "[Syntax]$./a_tree dirname\n";int main(int argc, char* argv[])try { const char* tree_dir="."; if(argc>2) { Wy::cerr << syntax; return(-1); } else { if(argc==2) { tree_dir=argv[1]; } } WyRet r; if((r=traverse(WyStr(tree_dir),WyStr()))!=Ok) { Wy::cout << tree_dir << " .." << Wy::wrd(r) << '\n'; return(-1); } return(0);}catch(const WyRet& e) { if(e!=Ok) { Wy::cerr << Wy::wrd(e) << '\n'; } return e->c_repcode();}catch(...) { Wy::cerr << "main caught(...)\n"; return(-1);};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -