/*type tells what to do. address1,2,3 are parameters - the values passed in bx,cx, and dx */ void handleinterrupt21(char type, char* address1, char* address2, char* address3) { if (type==1) bios_printstr(address1); else if (type==2) readstring(address1); else if (type==3) readfile(address1,address2); else if (type==4) writefile(address1,address2,address3); else if (type==5) delfile(address1); else if (type==6) executeprogram(address1,address2,0); else if (type==7) terminateprogram(); else if (type==8) executeprogram(address1,address2,1); else if (type==9) kill(address1); else if (type==10) makedir(address1,address2); else bios_printstr("ERROR: Invalid interrupt 21 code\r\n\0"); }
static void cb_walk_dir_empty(char *name, uint32_t flags, uint64_t len, int64_t lastWriteTime, walkdirempty_t *wdepy) { char path[_MAX_PATH]; if (wdepy->fn) { wdepy->fn(name, flags, len, lastWriteTime, wdepy->ctx); } sprintf(path, "%s\\%s", wdepy->path, name); if (flags & FILE_ATTRIBUTE_DIRECTORY) { RemoveDirectory(appendbackslash(path)); DWORD err = GetLastError(); } else { delfile(path); } return; }
// @rootdir: 欲遍历的根目录 // @subfolders: 是否要遍历子目录. 0: 不遍历 // @deepen: 遍历, 调用fn时给的参数是, 1: 浅到深, 0: 由深到浅 // 注: // 1.靠这种FindFirstFile方法删除目录是不行的.当检测到是目时,调用RemoveDirectory将返回总是失败(错误码:32,指示另有进行在使用) // FindClose后才可以,而这时close时不可能的事.要删目录改调用SHFileOperation. BOOL walk_dir_win32(const char* rootdir, int subfolders, int deepen, fn_walk_dir fn, uint32_t *ctx, int del) { char szCurrDir[_MAX_PATH], text[_MAX_PATH]; HANDLE hFind; WIN32_FIND_DATA finddata; BOOL fOk, fRet = TRUE; int64_t timestamp = 0; GetCurrentDirectory(_MAX_PATH, szCurrDir); SetCurrentDirectory(appendbackslash(rootdir)); hFind = FindFirstFile("*.*", &finddata); fOk = (hFind != INVALID_HANDLE_VALUE); while (fOk) { timestamp = FileTimeToUnixTime(finddata.ftLastWriteTime); if (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 目录 if ((strcmp(finddata.cFileName, ".") != 0) && (strcmp(finddata.cFileName, "..") != 0)) { if (deepen && fn) { // 由浅到深: 是先调用fn,再去在该目上递归 if (!fn(finddata.cFileName, FILE_ATTRIBUTE_DIRECTORY, posix_mku64(finddata.nFileSizeLow, finddata.nFileSizeHigh), timestamp, ctx)) { fRet = FALSE; break; } } sprintf(text, "%s\\%s\\", rootdir, finddata.cFileName); if (subfolders) { SetCurrentDirectory(text); walk_subdir_win32(rootdir, finddata.cFileName, deepen, fn, ctx); } if (!deepen && fn) { // 由深到浅: 是先在该目上递归,再去调动fn if (!fn(finddata.cFileName, FILE_ATTRIBUTE_DIRECTORY, posix_mku64(finddata.nFileSizeLow, finddata.nFileSizeHigh), timestamp, ctx)) { fRet = FALSE; break; } } if (del) { RemoveDirectory(text); DWORD err = GetLastError(); } } } else { // 文件 if (fn) { if (!fn(finddata.cFileName, 0, posix_mku64(finddata.nFileSizeLow, finddata.nFileSizeHigh), timestamp, ctx)) { fRet = FALSE; break; } } if (del) { sprintf(text, "%s\\%s", rootdir, finddata.cFileName); delfile(text); } } fOk = FindNextFile(hFind, &finddata); } if (hFind != INVALID_HANDLE_VALUE) { FindClose(hFind); } SetCurrentDirectory(szCurrDir); return fRet; }
bool delfile(const std::string & filepath) { return delfile(filepath.c_str()); }