/* * /// <summary> * /// usees 7zip * /// </summary> * /// <returns>zipArchive as RsbFile or null</returns> * public RaiFile Zip7() * { * var zip7 = new RaiFile(FullName + ".7z"); * zip7.rm(); // remove it if an old version exists * //var oldCurrentDir = Directory.GetCurrentDirectory(); * //Directory.SetCurrentDirectory("c:\\Program Files\\7-Zip\\"); * var call = new RaiSystem("7z", "a -mmt " + Os.escapeParam(zip7.FullName) + " " + Os.escapeParam(FullName)); * call.Exec(); * //Directory.SetCurrentDirectory(oldCurrentDir); * if (call.ExitCode == 0 && zip7.Exists()) * { * rm(); * return zip7; * } * return null; * } */ /* * /// <summary> * /// usees 7zip with options -t7z -m0=lzma2 -mx=9 -aoa * /// </summary> * /// <returns>zipArchive as RsbFile or null</returns> * public RaiFile ZipUltra() * { * var zip7 = new RaiFile(FullName + ".7z"); * zip7.rm(); // remove it if an old version exists * //var oldCurrentDir = Directory.GetCurrentDirectory(); * //Directory.SetCurrentDirectory("c:\\Program Files\\7-Zip\\"); * var call = new RaiSystem("7z", "a -t7z -m0=lzma2 -mx=9 -aoa " + Os.escapeParam(zip7.FullName) + " " + Os.escapeParam(FullName)); * call.Exec(); * //Directory.SetCurrentDirectory(oldCurrentDir); * if (call.ExitCode == 0 && zip7.Exists()) * { * rm(); * return zip7; * } * return null; * } */ /* * /// <summary> * /// unzip an 7z archive using 7z commandline * /// </summary> * /// <returns>and RsbFile - use the Path to identify where the taget file(s) are located</returns> * public RaiFile UnZip7() * { * var unzipped = new RaiFile(FullName.Substring(0, FullName.IndexOf(".7z"))); * var call = new RaiSystem("7z", "e " + Os.escapeParam(FullName) + " -o" + unzipped.Path); * call.Exec(); * // do not remove 7z file * return unzipped; * } */ /// <summary> /// copies the file on disk identified by the current RsbFile object to multiple destinations /// </summary> /// <param name="destDirs"></param> /// <returns></returns> public bool CopyTo(string[] destDirs) { try { RaiFile dest; string destName; foreach (var destDir in destDirs) { dest = new RaiFile(FullName) { Path = destDir }; destName = dest.FullName; dest.mkdir(); if (File.Exists(destName)) { File.Delete(destName); } File.Copy(FullName, destName); } } catch (Exception) { return(false); } return(true); }
/// <summary> /// Copy file /// </summary> /// <param name="from">will be checked; exception will be thrown if file name does not match RsbFile form requirements</param> /// <returns>0 if everything went well</returns> public int cp(RaiFile from) { // copy file in the file system var oldname = Os.winInternal(from.FullName); var newname = Os.winInternal(FullName); rm(); // make sure it's really gone before we go ahead; applies ensure File.Copy(oldname, newname, true); // overwrite if exists (which should never happen since we just removed it) #region double check if file has moved if (Ensure) { return(awaitFileMaterializing(newname)); } #endregion return(0); }
public int mv(RaiFile from) // relocates file in the file system { //bool destIsDropbox = Name.ToLower().Contains("dropbox"); //bool srcIsDropbox = from.Name.ToLower().Contains("dropbox"); //#region both files in Dropbox - no acceleration //#endregion mkdir(); // create destdir if necessary; applies ensure var newname = Os.winInternal(FullName); var oldname = Os.winInternal(from.FullName); rm(); // make sure it's really gone before we go ahead; applies ensure File.Move(oldname, newname); // make sure the user that w3wp runs under has write/delete access to oldname, i.e. c:\dropbox\config\3.3.3\Users.xml #region double check if file has moved if (Ensure) { return(awaitFileVanishing(oldname) + awaitFileMaterializing(newname)); } #endregion return(0); }
/// <summary> /// Constructor: auto-ensure mode for file systems that do not synchronously wait for the end of an IO operation i.e. Dropbox /// </summary> /// <remarks>only use the ensure mode if it has to be guaranteed that the IO operation was completely done /// when the method call returns; necessary e.g. for Dropbox directories since (currently) Dropbox first updates the /// file in the invisible . folder and then asynchronously updates the visible file and all the remote copies of it</remarks> /// <param name="filename"></param> public RaiFile(string filename) { Ensure = filename.ToLower().Contains("dropbox"); path = string.Empty; name = string.Empty; ext = string.Empty; if (!string.IsNullOrEmpty(filename)) { #region some unix conventions for convenience if (filename.StartsWith("~/")) { filename = $"{Os.HomeDir}{filename.Substring(1)}"; } else if (filename.StartsWith("./")) { filename = $"{Directory.GetCurrentDirectory()}{filename.Substring(1)}"; } else if (filename.StartsWith("../")) { var dir = Directory.GetCurrentDirectory(); while (filename.StartsWith("../")) { dir = new RaiFile(dir.TrimEnd('/')).Path; // one up filename = filename.Substring(3); // remove first ../ } filename = $"{dir}{filename}"; } #endregion filename = Os.NormSeperator(filename); var k = filename.LastIndexOf(Os.DIRSEPERATOR); if (k >= 0) { path = filename.Substring(0, k + 1); Name = filename.Substring(k + 1); } else { Name = filename; // also takes care of ext } } }
/// <summary> /// zip this file into archive /// </summary> /// <returns>the archive name</returns> public RaiFile Zip() { var inFolder = new RaiFile(this.FullName); var file = new RaiFile(this.FullName); inFolder.Name = file.Name; inFolder.Path = inFolder.Path + inFolder.Name; inFolder.mv(file); file.Ext = file.Ext + ".zip"; File.Delete(file.FullName); // delete any pre-existing file try { ZipFile.CreateFromDirectory(inFolder.Path, file.FullName); //ZipFile. } catch (Exception) { return(null); } return(file); }
/// <summary>create a backup file</summary> /// <param name="copy">moves if false, copies otherwise</param> /// <returns>name of backupfile, if there was one created</returns> /// <remarks>the Os.LocalBackupDir will be used; make sure it's not in the Dropbox</remarks> public string backup(bool copy = false) { if (!File.Exists(FullName)) { return(null); // no file no backup } var backupFile = new RaiFile(FullName); var idx = (backupFile.Path.Length > 2 && backupFile.Path[1] == ':') ? 3 : 0; // works as expected for c:/123 or c:\123, but not for c:123 var s = backupFile.Path.Substring(idx); backupFile.Path = (Os.LocalBackupDir + s).Replace("Dropbox/", "").Replace("dropbox/", ""); // eliminates Dropbox for LocalBackupDir to avoid ensure mkdir(backupFile.Path); backupFile.Name = backupFile.Name + " " + DateTimeOffset.UtcNow.ToString(Os.DATEFORMAT); backupFile.Ext = Ext; if (copy) { backupFile.cp(this); } else { backupFile.mv(this); } return(backupFile.FullName); }