示例#1
0
 /// <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));
 }
示例#2
0
        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
示例#3
0
        /// <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);
        }
示例#4
0
        }//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;
          }
        }
示例#5
0
        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
示例#6
0
 /// <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); 
 }
示例#7
0
        /// <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);
        }
示例#8
0
        }//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;
                }
            }
        }