예제 #1
0
        private bool CopyFileWithLogging(Microsoft.Build.Tasks.FileState sourceFileState, Microsoft.Build.Tasks.FileState destinationFileState)
        {
            bool exists = false;

            if (Directory.Exists(destinationFileState.Name))
            {
                base.Log.LogErrorWithCodeFromResources("Copy.DestinationIsDirectory", new object[] { sourceFileState.Name, destinationFileState.Name });
                return(false);
            }
            if (Directory.Exists(sourceFileState.Name))
            {
                base.Log.LogErrorWithCodeFromResources("Copy.SourceIsDirectory", new object[] { sourceFileState.Name });
                return(false);
            }
            string directoryName = Path.GetDirectoryName(destinationFileState.Name);

            if (((directoryName != null) && (directoryName.Length > 0)) && !Directory.Exists(directoryName))
            {
                base.Log.LogMessageFromResources(MessageImportance.Normal, "Copy.CreatesDirectory", new object[] { directoryName });
                Directory.CreateDirectory(directoryName);
            }
            if (this.overwriteReadOnlyFiles)
            {
                this.MakeFileWriteable(destinationFileState, true);
                exists = destinationFileState.Exists;
            }
            bool flag2 = false;

            if (this.UseHardlinksIfPossible)
            {
                base.Log.LogMessageFromResources(MessageImportance.Normal, "Copy.HardLinkComment", new object[] { sourceFileState.Name, destinationFileState.Name });
                if (!this.overwriteReadOnlyFiles)
                {
                    exists = destinationFileState.Exists;
                }
                if (exists && !IsMatchingSizeAndTimeStamp(sourceFileState, destinationFileState))
                {
                    Microsoft.Build.Shared.FileUtilities.DeleteNoThrow(destinationFileState.Name);
                }
                flag2 = Microsoft.Build.Tasks.NativeMethods.CreateHardLink(destinationFileState.Name, sourceFileState.Name, IntPtr.Zero);
                if (!flag2)
                {
                    Exception exceptionForHR = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
                    base.Log.LogMessageFromResources(MessageImportance.Low, "Copy.RetryingAsFileCopy", new object[] { sourceFileState.Name, destinationFileState.Name, exceptionForHR.Message });
                }
            }
            if (!flag2)
            {
                base.Log.LogMessageFromResources(MessageImportance.Normal, "Copy.FileComment", new object[] { sourceFileState.Name, destinationFileState.Name });
                File.Copy(sourceFileState.Name, destinationFileState.Name, true);
            }
            destinationFileState.Reset();
            this.MakeFileWriteable(destinationFileState, false);
            return(true);
        }
예제 #2
0
 private void MakeFileWriteable(Microsoft.Build.Tasks.FileState file, bool logActivity)
 {
     if (file.Exists && file.IsReadOnly)
     {
         if (logActivity)
         {
             base.Log.LogMessageFromResources(MessageImportance.Low, "Copy.RemovingReadOnlyAttribute", new object[] { file.Name });
         }
         File.SetAttributes(file.Name, FileAttributes.Normal);
         file.Reset();
     }
 }
예제 #3
0
        private bool DoCopyWithRetries(Microsoft.Build.Tasks.FileState sourceFileState, Microsoft.Build.Tasks.FileState destinationFileState, CopyFileWithState copyFile)
        {
            bool flag = false;
            int  num  = 0;

Label_0004:
            try
            {
                flag = copyFile(sourceFileState, destinationFileState);
            }
            catch (Exception exception)
            {
                if (Microsoft.Build.Shared.ExceptionHandling.NotExpectedException(exception))
                {
                    throw;
                }
                if (num >= this.Retries)
                {
                    if (this.Retries > 0)
                    {
                        base.Log.LogErrorWithCodeFromResources("Copy.ExceededRetries", new object[] { sourceFileState.Name, destinationFileState.Name, this.Retries });
                        throw;
                    }
                    throw;
                }
                num++;
                base.Log.LogWarningWithCodeFromResources("Copy.Retrying", new object[] { sourceFileState.Name, destinationFileState.Name, num, this.RetryDelayMilliseconds, exception.Message });
                Thread.Sleep(this.RetryDelayMilliseconds);
                goto Label_0004;
            }
            if (flag)
            {
                return(true);
            }
            if (num < this.Retries)
            {
                num++;
                base.Log.LogWarningWithCodeFromResources("Copy.Retrying", new object[] { sourceFileState.Name, destinationFileState.Name, num, this.RetryDelayMilliseconds, string.Empty });
                Thread.Sleep(this.RetryDelayMilliseconds);
                goto Label_0004;
            }
            if (this.Retries > 0)
            {
                base.Log.LogErrorWithCodeFromResources("Copy.ExceededRetries", new object[] { sourceFileState.Name, destinationFileState.Name, this.Retries });
                return(false);
            }
            return(false);
        }
예제 #4
0
 private static bool IsMatchingSizeAndTimeStamp(Microsoft.Build.Tasks.FileState sourceFile, Microsoft.Build.Tasks.FileState destinationFile)
 {
     if (!destinationFile.Exists)
     {
         return(false);
     }
     if (sourceFile.LastWriteTime != destinationFile.LastWriteTime)
     {
         return(false);
     }
     if (sourceFile.Length != destinationFile.Length)
     {
         return(false);
     }
     return(true);
 }
예제 #5
0
        private bool DoCopyIfNecessary(Microsoft.Build.Tasks.FileState sourceFileState, Microsoft.Build.Tasks.FileState destinationFileState, CopyFileWithState copyFile)
        {
            bool flag = true;

            try
            {
                if (this.skipUnchangedFiles && IsMatchingSizeAndTimeStamp(sourceFileState, destinationFileState))
                {
                    base.Log.LogMessageFromResources(MessageImportance.Low, "Copy.DidNotCopyBecauseOfFileMatch", new object[] { sourceFileState.Name, destinationFileState.Name, "SkipUnchangedFiles", "true" });
                    return(flag);
                }
                if (string.Compare(sourceFileState.Name, destinationFileState.Name, StringComparison.OrdinalIgnoreCase) != 0)
                {
                    flag = this.DoCopyWithRetries(sourceFileState, destinationFileState, copyFile);
                }
            }
            catch (PathTooLongException exception)
            {
                base.Log.LogErrorWithCodeFromResources("Copy.Error", new object[] { sourceFileState.Name, destinationFileState.Name, exception.Message });
                flag = false;
            }
            catch (IOException exception2)
            {
                if (this.PathsAreIdentical(sourceFileState.Name, destinationFileState.Name))
                {
                    return(flag);
                }
                if (Microsoft.Build.Shared.ExceptionHandling.NotExpectedException(exception2))
                {
                    throw;
                }
                base.Log.LogErrorWithCodeFromResources("Copy.Error", new object[] { sourceFileState.Name, destinationFileState.Name, exception2.Message });
                flag = false;
            }
            catch (Exception exception3)
            {
                if (Microsoft.Build.Shared.ExceptionHandling.NotExpectedException(exception3))
                {
                    throw;
                }
                base.Log.LogErrorWithCodeFromResources("Copy.Error", new object[] { sourceFileState.Name, destinationFileState.Name, exception3.Message });
                flag = false;
            }
            return(flag);
        }