/// <summary> /// Async version of DeepCopyTo(...) /// </summary> public Task DeepCopyToAsync(FileSystemDirectory target, DirCopyFlags flags = DirCopyFlags.All, int bufferSize = 64 * 1024, Func <FileSystemSessionItem, bool> filter = null, Func <FileSystemSessionItem, bool> cancel = null) { return(m_FileSystem.DoDirectoryDeepCopyAsync(this, target, flags, bufferSize, filter, cancel)); }
private void deepCopyTo(FileSystemDirectory target, DirCopyFlags flags, byte[] buffer, Func <FileSystemSessionItem, bool> filter) { target.CheckCanChange(); if (flags.HasFlag(DirCopyFlags.Directories)) { foreach (var sdn in this.SubDirectoryNames) { using (var sdir = this.GetSubDirectory(sdn)) if (filter == null || filter(sdir)) { using (var newSDir = target.CreateDirectory(sdn)) { copyCommonAttributes(sdir, newSDir, buffer, flags); if (flags.HasFlag(DirCopyFlags.Readonly) && this.FileSystem.InstanceCapabilities.SupportsReadonlyDirectories && target.FileSystem.InstanceCapabilities.SupportsReadonlyDirectories) { newSDir.ReadOnly = sdir.ReadOnly; } sdir.deepCopyTo(newSDir, flags, buffer, filter); } } } } if (flags.HasFlag(DirCopyFlags.Files)) { foreach (var fn in this.FileNames) { using (var file = this.GetFile(fn)) if (filter == null || filter(file)) { using (var newFile = target.CreateFile(fn)) { copyCommonAttributes(file, newFile, buffer, flags); if (flags.HasFlag(DirCopyFlags.Readonly) && this.FileSystem.InstanceCapabilities.SupportsReadonlyFiles && target.FileSystem.InstanceCapabilities.SupportsReadonlyFiles) { newFile.ReadOnly = file.ReadOnly; } copyStream(file.FileStream, newFile.FileStream, buffer); } } } } }//deepCopyTo
/// <summary> /// Performs a deep copy of this directory into another directory that may belong to a different file system. /// This method allows to copy directory trees between different file systems i.e. from SVN into AmazonS3 or local file system etc. /// </summary> /// <param name="target">Target directory where the files will be placed. It's name does not have to be the same as the source's name</param> /// <param name="flags">Copy flags that specify what to copy</param> /// <param name="bufferSize">Copy buffer size</param> /// <param name="filter">Optional filter function</param> public void DeepCopyTo(FileSystemDirectory target, DirCopyFlags flags = DirCopyFlags.All, int bufferSize = 64 * 1024, Func <FileSystemSessionItem, bool> filter = null) { const int MAX_BUFFER = 64 * 1024 * 1024; if (bufferSize <= 0) { bufferSize = 4 * 1024; } if (bufferSize > MAX_BUFFER) { bufferSize = MAX_BUFFER; } var buffer = new byte[bufferSize]; deepCopyTo(target, flags, buffer, filter); }
}//deepCopyTo private void copyCommonAttributes(FileSystemSessionItem source, FileSystemSessionItem target, byte[] buffer, DirCopyFlags flags) { if (flags.HasFlag(DirCopyFlags.Security) && this.FileSystem.InstanceCapabilities.SupportsSecurity && target.FileSystem.InstanceCapabilities.SupportsSecurity) copyStream(source.PermissionsStream, target.PermissionsStream, buffer); if (flags.HasFlag(DirCopyFlags.Metadata) && this.FileSystem.InstanceCapabilities.SupportsCustomMetadata && target.FileSystem.InstanceCapabilities.SupportsCustomMetadata) copyStream(source.MetadataStream, target.MetadataStream, buffer); if (flags.HasFlag(DirCopyFlags.Timestamps)) { if (this.FileSystem.InstanceCapabilities.SupportsCreationTimestamps && target.FileSystem.InstanceCapabilities.SupportsCreationTimestamps) target.CreationTimestamp = source.CreationTimestamp; if (this.FileSystem.InstanceCapabilities.SupportsModificationTimestamps && target.FileSystem.InstanceCapabilities.SupportsModificationTimestamps) target.ModificationTimestamp = source.ModificationTimestamp; if (this.FileSystem.InstanceCapabilities.SupportsLastAccessTimestamps && target.FileSystem.InstanceCapabilities.SupportsLastAccessTimestamps) target.LastAccessTimestamp = source.LastAccessTimestamp; } }
private void deepCopyTo(FileSystemDirectory target, DirCopyFlags flags, byte[] buffer, Func<FileSystemSessionItem, bool> filter, Func<FileSystemSessionItem, bool> cancel = null) { target.CheckCanChange(); if (flags.HasFlag(DirCopyFlags.Directories)) { foreach(var sdn in this.SubDirectoryNames) using(var sdir = this.GetSubDirectory(sdn)) if (filter==null||filter(sdir)) { if (cancel != null && cancel(sdir)) return; using(var newSDir = target.CreateDirectory(sdn)) { copyCommonAttributes(sdir, newSDir, buffer, flags); if (flags.HasFlag(DirCopyFlags.Readonly) && this.FileSystem.InstanceCapabilities.SupportsReadonlyDirectories && target.FileSystem.InstanceCapabilities.SupportsReadonlyDirectories) newSDir.ReadOnly = sdir.ReadOnly; sdir.deepCopyTo(newSDir, flags, buffer, filter, cancel); } }//if } if (flags.HasFlag(DirCopyFlags.Files)) { foreach(var fn in this.FileNames) using(var file = this.GetFile(fn)) if (filter==null||filter(file)) { if (cancel != null && cancel(file)) return; using(var newFile = target.CreateFile(fn)) { copyCommonAttributes(file, newFile, buffer, flags); if (flags.HasFlag(DirCopyFlags.Readonly) && this.FileSystem.InstanceCapabilities.SupportsReadonlyFiles && target.FileSystem.InstanceCapabilities.SupportsReadonlyFiles) newFile.ReadOnly = file.ReadOnly; copyStream(file.FileStream, newFile.FileStream, buffer); } } } }//deepCopyTo
/// <summary> /// Async version of DeepCopyTo(...) /// </summary> public Task DeepCopyToAsync(FileSystemDirectory target, DirCopyFlags flags = DirCopyFlags.All, int bufferSize = 64 * 1024, Func<FileSystemSessionItem, bool> filter = null, Func<FileSystemSessionItem, bool> cancel = null) { return m_FileSystem.DoDirectoryDeepCopyAsync(this, target, flags, bufferSize, filter, cancel); }
/// <summary> /// Performs a deep copy of this directory into another directory that may belong to a different file system. /// This method allows to copy directory trees between different file systems i.e. from SVN into AmazonS3 or local file system etc. /// </summary> /// <param name="target">Target directory where the files will be placed. It's name does not have to be the same as the source's name</param> /// <param name="flags">Copy flags that specify what to copy</param> /// <param name="bufferSize">Copy buffer size</param> /// <param name="filter">Optional filter function</param> /// <param name="cancel">Optional cancellation function. Return true to abort copying</param> public void DeepCopyTo(FileSystemDirectory target, DirCopyFlags flags = DirCopyFlags.All, int bufferSize = 64 * 1024, Func<FileSystemSessionItem, bool> filter = null, Func<FileSystemSessionItem, bool> cancel = null) { const int MAX_BUFFER = 64 * 1024 * 1024; if (bufferSize<=0) bufferSize = 4 * 1024; if (bufferSize>MAX_BUFFER) bufferSize = MAX_BUFFER; var buffer = new byte[bufferSize]; deepCopyTo(target, flags, buffer, filter, cancel); }
}//deepCopyTo private void copyCommonAttributes(FileSystemSessionItem source, FileSystemSessionItem target, byte[] buffer, DirCopyFlags flags) { if (flags.HasFlag(DirCopyFlags.Security) && this.FileSystem.InstanceCapabilities.SupportsSecurity && target.FileSystem.InstanceCapabilities.SupportsSecurity) { copyStream(source.PermissionsStream, target.PermissionsStream, buffer); } if (flags.HasFlag(DirCopyFlags.Metadata) && this.FileSystem.InstanceCapabilities.SupportsCustomMetadata && target.FileSystem.InstanceCapabilities.SupportsCustomMetadata) { copyStream(source.MetadataStream, target.MetadataStream, buffer); } if (flags.HasFlag(DirCopyFlags.Timestamps)) { if (this.FileSystem.InstanceCapabilities.SupportsCreationTimestamps && target.FileSystem.InstanceCapabilities.SupportsCreationTimestamps) { target.CreationTimestamp = source.CreationTimestamp; } if (this.FileSystem.InstanceCapabilities.SupportsModificationTimestamps && target.FileSystem.InstanceCapabilities.SupportsModificationTimestamps) { target.ModificationTimestamp = source.ModificationTimestamp; } if (this.FileSystem.InstanceCapabilities.SupportsLastAccessTimestamps && target.FileSystem.InstanceCapabilities.SupportsLastAccessTimestamps) { target.LastAccessTimestamp = source.LastAccessTimestamp; } } }