コード例 #1
0
        /// <summary>
        /// Copy or move a single transfer.
        /// </summary>
        /// <param name="backend">Compiler backend that generated the transfers.</param>
        /// <param name="transfer">File transfers to execute.</param>
        public static void ExecuteTransfer(BackendCompiler backend, FileTransfer transfer)
        {
            if (transfer.Redundant)
            {
                // TODO: log that we tried to transfer a redundant file?
                return;
            }

            bool retry = false;

            do
            {
                try
                {
                    if (transfer.Move)
                    {
                        backend.OnMessage(new CompilerMessageEventArgs(CompilerMessage.MoveFile(transfer.Source, transfer.Destination), transfer.LineNumber));
                        File.Move(transfer.Source, transfer.Destination);
                    }
                    else
                    {
                        backend.OnMessage(new CompilerMessageEventArgs(CompilerMessage.CopyFile(transfer.Source, transfer.Destination), transfer.LineNumber));
                        File.Copy(transfer.Source, transfer.Destination, true);
                    }

                    retry = false;
                }
                catch (FileNotFoundException e)
                {
                    throw new CompilerException(new CompilerMessageEventArgs(CompilerMessage.FileNotFound(transfer.Source), transfer.LineNumber), e);
                }
                catch (DirectoryNotFoundException dnfe)
                {
                    // if we already retried, give up
                    if (retry)
                    {
                        throw new CompilerException(new CompilerMessageEventArgs(CompilerMessage.CannotTransferFile(transfer.Source, transfer.Destination), transfer.LineNumber), dnfe);
                    }

                    string directory = Path.GetDirectoryName(transfer.Destination);
                    Directory.CreateDirectory(directory);
                    retry = true;
                }
                catch (UnauthorizedAccessException uae)
                {
                    // if we already retried, give up
                    if (retry)
                    {
                        throw new CompilerException(new CompilerMessageEventArgs(CompilerMessage.CannotTransferFile(transfer.Source, transfer.Destination), transfer.LineNumber), uae);
                    }

                    FileTransfer.RemoveDestination(backend, transfer);
                    retry = true;
                }
                catch (IOException e)
                {
                    // if we already retried, give up
                    if (retry)
                    {
                        throw new CompilerException(new CompilerMessageEventArgs(CompilerMessage.CannotTransferFile(transfer.Source, transfer.Destination), transfer.LineNumber), e);
                    }

                    FileTransfer.RemoveDestination(backend, transfer);
                    retry = true;
                }
            } while (retry);
        }