bool DlgCompareDir::FetchDir(String dir, VectorMap<String, FileInfo>& files, VectorMap<String, String>& dirs) { FindFile ff; if(!ff.Search(AppendFileName(dir, "*"))) return false; do if(ff.IsFile() && PatternMatchMulti(fm, ff.GetName())) files.Add(NormalizePathCase(ff.GetName()), FileInfo(ff.GetName(), ff.GetLength(), ff.GetLastWriteTime())); else if(ff.IsFolder()) dirs.Add(NormalizePathCase(ff.GetName()), ff.GetName()); while(ff.Next()); return true; }
void SearchForFiles(Index<String>& files, String dir, String mask, int readonly, Progress& pi) { FindFile ff(AppendFileName(dir, "*.*")); while(ff) { if(ff.IsFolder() && *ff.GetName() != '.') SearchForFiles(files, AppendFileName(dir, ff.GetName()), mask, readonly, pi); else if(ff.IsFile() && PatternMatchMulti(mask, ff.GetName())) { if(IsNull(readonly) || !!readonly == !!ff.IsReadOnly()) { if(pi.StepCanceled()) return; files.FindAdd(AppendFileName(dir, ff.GetName())); } } ff.Next(); } }
void WorkspaceWork::DoImportTree(const String& dir, const String& mask, bool sep, Progress& pi, int from) { String active = GetActivePackage(); if(active.IsEmpty()) return; FindFile ff(AppendFileName(dir, "*.*")); Vector<String> dirs, files; while(ff) { String p = AppendFileName(dir, ff.GetName()); if(ff.IsFile() && PatternMatchMulti(mask, ff.GetName())) files.Add(p); if(ff.IsFolder()) dirs.Add(p); ff.Next(); } String relPath(dir.Mid(from)), absPath = SourcePath(active, relPath); if(sep && files.GetCount()) { if(!DirectoryExists(absPath)) if(!RealizeDirectory(absPath)) throw Format("An error occurred while creating the directory:&\1%s", absPath); Package::File& f = actual.file.Add(); f = relPath; f.separator = f.readonly = true; } Sort(files, &FileOrder_); Sort(dirs, &FileOrder_); for(int i = 0; i < files.GetCount(); i++) { if(pi.StepCanceled()) throw String(); String name = GetFileName(files[i]); if(FileCopy(files[i], AppendFileName(absPath, name))) { Package::File& f = actual.file.Add(); f = AppendFileName(relPath, name); f.separator = f.readonly = false; } else throw Format("An error occurred while copying the file:&\1%s", files[i]); } for(int i = 0; i < dirs.GetCount(); i++) DoImportTree(dirs[i], mask, true, pi, from); }
void WorkspaceWork::DoImport(const String& dir, const String& mask, bool sep, Progress& pi) { String active = GetActivePackage(); if(active.IsEmpty()) return; FindFile ff(AppendFileName(dir, "*.*")); Vector<String> dirs, files; while(ff) { String p = AppendFileName(dir, ff.GetName()); if(ff.IsFile() && PatternMatchMulti(mask, ff.GetName())) files.Add(p); if(ff.IsFolder()) dirs.Add(p); ff.Next(); } if(sep && files.GetCount()) { Package::File& f = actual.file.Add(); f = GetFileTitle(dir); f.separator = f.readonly = true; } Sort(files, &FileOrder_); Sort(dirs, &FileOrder_); for(int i = 0; i < files.GetCount(); i++) { if(pi.StepCanceled()) throw String(); String name = GetFileName(files[i]); if(FileCopy(files[i], SourcePath(active, name))) { Package::File& f = actual.file.Add(); f = name; f.separator = f.readonly = false; } else throw Format("An error occurred while copying the file:&\1%s", files[i]); } for(int i = 0; i < dirs.GetCount(); i++) DoImport(dirs[i], mask, true, pi); }