void DeleteDirTree(const wchar_t *Dir) { if (!*Dir || (IsSlash(Dir[0]) && !Dir[1]) || (Dir[1]==L':' && IsSlash(Dir[2]) && !Dir[3])) return; string strFullName; FAR_FIND_DATA_EX FindData; ScanTree ScTree(TRUE,TRUE,FALSE); ScTree.SetFindPath(Dir,L"*",0); while (ScTree.GetNextName(&FindData, strFullName)) { apiSetFileAttributes(strFullName,FILE_ATTRIBUTE_NORMAL); if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (ScTree.IsDirSearchDone()) apiRemoveDirectory(strFullName); } else apiDeleteFile(strFullName); } apiSetFileAttributes(Dir,FILE_ATTRIBUTE_NORMAL); apiRemoveDirectory(Dir); }
int ERemoveDirectory(const string& Name,DIRDELTYPE Type) { ProcessedItems++; string strFullName; ConvertNameToFull(Name,strFullName); bool Success = false; while(!Success) { switch(Type) { case D_DEL: Success = apiRemoveDirectory(Name) != FALSE; break; case D_WIPE: Success = WipeDirectory(Name) != FALSE; break; case D_RECYCLE: Success = RemoveToRecycleBin(Name) != FALSE; break; } if(!Success) { int MsgCode; if (SkipFoldersMode!=-1) { MsgCode=SkipFoldersMode; } else { MsgCode=OperationFailed(Name, MError, MSG(MCannotDeleteFolder)); } switch (MsgCode) { case -1: case -2: case 3: return DELETE_CANCEL; case 1: return DELETE_SKIP; case 2: SkipFoldersMode=2; return DELETE_SKIP; } } } return DELETE_SUCCESS; }
int DeleteFileWithFolder(const string& FileName) { string strFileOrFolderName; strFileOrFolderName = FileName; Unquote(strFileOrFolderName); BOOL Ret=apiSetFileAttributes(strFileOrFolderName,FILE_ATTRIBUTE_NORMAL); if (Ret) { if (apiDeleteFile(strFileOrFolderName)) //BUGBUG { CutToSlash(strFileOrFolderName,true); return apiRemoveDirectory(strFileOrFolderName); } } return FALSE; }
int ERemoveDirectory(const wchar_t *Name,int Wipe) { ProcessedItems++; string strFullName; ConvertNameToFull(Name,strFullName); for (;;) { if (Wipe) { if (WipeDirectory(Name)) break; } else if (apiRemoveDirectory(Name)) break; int MsgCode; if (SkipFoldersMode!=-1) MsgCode=SkipFoldersMode; else { MsgCode=Message(MSG_WARNING|MSG_ERRORTYPE,4,MSG(MError), MSG(MCannotDeleteFolder),Name,MSG(MDeleteRetry), MSG(MDeleteSkip),MSG(MDeleteFileSkipAll),MSG(MDeleteCancel)); } switch (MsgCode) { case -1: case -2: case 3: return DELETE_CANCEL; case 1: return DELETE_SKIP; case 2: SkipFoldersMode=2; return DELETE_SKIP; } } return DELETE_SUCCESS; }
int WipeDirectory(const string& Name) { string strTempName, strPath; if (FirstSlash(Name)) { strPath = Name; DeleteEndSlash(strPath); CutToSlash(strPath); } FarMkTempEx(strTempName,nullptr, FALSE, strPath.IsEmpty()?nullptr:strPath.CPtr()); if (!apiMoveFile(Name, strTempName)) { return FALSE; } return apiRemoveDirectory(strTempName); }
int WipeDirectory(const wchar_t *Name) { string strTempName, strPath; if (FirstSlash(Name)) { strPath = Name; DeleteEndSlash(strPath); CutToSlash(strPath); } FarMkTempEx(strTempName,nullptr, FALSE, strPath.IsEmpty()?nullptr:strPath.CPtr()); if (!apiMoveFile(Name, strTempName)) { SetLastError((_localLastError = GetLastError())); return FALSE; } return apiRemoveDirectory(strTempName); }
void FileList::ReadDiz(PluginPanelItem *ItemList,int ItemLength,DWORD dwFlags) { if (DizRead) return; DizRead=TRUE; Diz.Reset(); if (PanelMode==NORMAL_PANEL) { Diz.Read(strCurDir); } else { PluginPanelItem *PanelData=nullptr; size_t PluginFileCount=0; OpenPanelInfo Info; CtrlObject->Plugins->GetOpenPanelInfo(hPlugin,&Info); if (!Info.DescrFilesNumber) return; int GetCode=TRUE; /* $ 25.02.2001 VVM + Обработка флага RDF_NO_UPDATE */ if (!ItemList && !(dwFlags & RDF_NO_UPDATE)) { GetCode=CtrlObject->Plugins->GetFindData(hPlugin,&PanelData,&PluginFileCount,0); } else { PanelData=ItemList; PluginFileCount=ItemLength; } if (GetCode) { for (size_t I=0; I<Info.DescrFilesNumber; I++) { PluginPanelItem *CurPanelData=PanelData; for (size_t J=0; J < PluginFileCount; J++, CurPanelData++) { string strFileName = CurPanelData->FileName; if (!StrCmpI(strFileName,Info.DescrFiles[I])) { string strTempDir, strDizName; if (FarMkTempEx(strTempDir) && apiCreateDirectory(strTempDir,nullptr)) { if (CtrlObject->Plugins->GetFile(hPlugin,CurPanelData,strTempDir,strDizName,OPM_SILENT|OPM_VIEW|OPM_QUICKVIEW|OPM_DESCR)) { strPluginDizName = Info.DescrFiles[I]; Diz.Read(L"", &strDizName); DeleteFileWithFolder(strDizName); I=Info.DescrFilesNumber; break; } apiRemoveDirectory(strTempDir); //ViewPanel->ShowFile(nullptr,FALSE,nullptr); } } } } /* $ 25.02.2001 VVM + Обработка флага RDF_NO_UPDATE */ if (!ItemList && !(dwFlags & RDF_NO_UPDATE)) CtrlObject->Plugins->FreeFindData(hPlugin,PanelData,PluginFileCount); } } for (int I=0; I<FileCount; I++) { if (!ListData[I]->DizText) { ListData[I]->DeleteDiz=FALSE; ListData[I]->DizText=(wchar_t*)Diz.GetDizTextAddr(ListData[I]->strName,ListData[I]->strShortName,ListData[I]->FileSize); } } }
void PrintFiles(Panel *SrcPanel) { _ALGO(CleverSysLog clv(L"Alt-F5 (PrintFiles)")); string strPrinterName; DWORD Needed,Returned; int PrinterNumber; DWORD FileAttr; string strSelName; long DirsCount=0; int SelCount=SrcPanel->GetSelCount(); if (!SelCount) { _ALGO(SysLog(L"Error: !SelCount")); return; } // проверка каталогов _ALGO(SysLog(L"Check for FILE_ATTRIBUTE_DIRECTORY")); SrcPanel->GetSelName(nullptr,FileAttr); while (SrcPanel->GetSelName(&strSelName,FileAttr)) { if (TestParentFolderName(strSelName) || (FileAttr & FILE_ATTRIBUTE_DIRECTORY)) DirsCount++; } if (DirsCount==SelCount) return; PRINTER_INFO *pi = nullptr; if (EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,nullptr,PRINTER_INFO_LEVEL,nullptr,0,&Needed,&Returned) || Needed<=0) return; pi = (PRINTER_INFO *)xf_malloc(Needed); if (!EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,nullptr,PRINTER_INFO_LEVEL,(LPBYTE)pi,Needed,&Needed,&Returned)) { Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MPrintTitle),MSG(MCannotEnumeratePrinters),MSG(MOk)); xf_free(pi); return; } { _ALGO(CleverSysLog clv2(L"Show Menu")); string strTitle; string strName; if (SelCount==1) { SrcPanel->GetSelName(nullptr,FileAttr); SrcPanel->GetSelName(&strName,FileAttr); TruncStr(strName,50); strSelName=strName; InsertQuote(strSelName); strTitle.Format(MSG(MPrintTo), strSelName.CPtr()); } else { _ALGO(SysLog(L"Correct: SelCount-=DirsCount")); SelCount-=DirsCount; strTitle.Format(MSG(MPrintFilesTo),SelCount); } VMenu PrinterList(strTitle,nullptr,0,ScrY-4); PrinterList.SetFlags(VMENU_WRAPMODE|VMENU_SHOWAMPERSAND); PrinterList.SetPosition(-1,-1,0,0); AddToPrintersMenu(&PrinterList,pi,Returned); PrinterList.Process(); PrinterNumber=PrinterList.Modal::GetExitCode(); if (PrinterNumber<0) { xf_free(pi); _ALGO(SysLog(L"ESC")); return; } int nSize = PrinterList.GetUserDataSize(); wchar_t *PrinterName = strPrinterName.GetBuffer(nSize); PrinterList.GetUserData(PrinterName, nSize); strPrinterName.ReleaseBuffer(); } HANDLE hPrinter; if (!OpenPrinter((wchar_t*)strPrinterName.CPtr(),&hPrinter,nullptr)) { Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MPrintTitle),MSG(MCannotOpenPrinter), strPrinterName,MSG(MOk)); xf_free(pi); _ALGO(SysLog(L"Error: Cannot Open Printer")); return; } { _ALGO(CleverSysLog clv3(L"Print selected Files")); //SaveScreen SaveScr; TPreRedrawFuncGuard preRedrawFuncGuard(PR_PrintMsg); SetCursorType(FALSE,0); PR_PrintMsg(); HANDLE hPlugin=SrcPanel->GetPluginHandle(); int PluginMode=SrcPanel->GetMode()==PLUGIN_PANEL && !CtrlObject->Plugins.UseFarCommand(hPlugin,PLUGIN_FARGETFILE); SrcPanel->GetSelName(nullptr,FileAttr); while (SrcPanel->GetSelName(&strSelName,FileAttr)) { if (TestParentFolderName(strSelName) || (FileAttr & FILE_ATTRIBUTE_DIRECTORY)) continue; int Success=FALSE; LPCWSTR FileName = nullptr; string strTempDir, strTempName; if (PluginMode) { if (FarMkTempEx(strTempDir)) { apiCreateDirectory(strTempDir,nullptr); FileListItem ListItem; if (SrcPanel->GetLastSelectedItem(&ListItem)) { PluginPanelItem PanelItem; FileList::FileListToPluginItem(&ListItem,&PanelItem); if (CtrlObject->Plugins.GetFile(hPlugin,&PanelItem,strTempDir,strTempName,OPM_SILENT)) FileName = strTempName; else apiRemoveDirectory(strTempDir); FileList::FreePluginPanelItem(&PanelItem); } } } else FileName = strSelName; File SrcFile; if(SrcFile.Open(FileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, nullptr, OPEN_EXISTING)) { DOC_INFO_1 di1 = {const_cast<LPWSTR>(FileName)}; if (StartDocPrinter(hPrinter,1,(LPBYTE)&di1)) { char Buffer[8192]; DWORD Read,Written; Success=TRUE; while (SrcFile.Read(Buffer, sizeof(Buffer), Read) && Read > 0) if (!WritePrinter(hPrinter,Buffer,Read,&Written)) { Success=FALSE; break; } EndDocPrinter(hPrinter); } SrcFile.Close(); } if (!strTempName.IsEmpty()) { DeleteFileWithFolder(strTempName); } if (Success) SrcPanel->ClearLastGetSelection(); else { if (Message(MSG_WARNING|MSG_ERRORTYPE,2,MSG(MPrintTitle),MSG(MCannotPrint), strSelName,MSG(MSkip),MSG(MCancel))) break; } } ClosePrinter(hPrinter); } SrcPanel->Redraw(); xf_free(pi); }