另一个进程错误使用的文件

时间:2014-11-19 03:01:06

标签: c# .net winscp winscp-net

任何人都可以告诉我如何摆脱错误

  

该进程无法访问该文件,因为该文件正由另一个进程

使用

这是我的代码

if (!File.Exists(FlagFilePath))
{
    Debug.WriteLine("Trying to download sales data file ");

    SessionOptions sessionOptions = new SessionOptions
    {
        Protocol = Protocol.Sftp,
        HostName = ConfigurationManager.AppSettings["SFTPDomain"],
        UserName = ConfigurationManager.AppSettings["SFTPUser"],
        Password = ConfigurationManager.AppSettings["SFTPPass"],
        PortNumber = Convert.ToInt32(ConfigurationManager.AppSettings["SFTPPortNumber"]),
        GiveUpSecurityAndAcceptAnySshHostKey = true,

    };

    using (Session session = new Session())
    {

        //Attempts to connect to your SFtp site
        session.Open(sessionOptions);

        //Get SFtp File
        TransferOptions transferOptions = new TransferOptions();
        transferOptions.TransferMode = TransferMode.Binary; //The Transfer Mode - Automatic, Binary, or Ascii 
        transferOptions.FilePermissions = null;  //Permissions applied to remote files; 
        transferOptions.PreserveTimestamp = false;  //Set last write time of destination file 
        //to that of source file - basically change the timestamp to match destination and source files.    
        transferOptions.ResumeSupport.State = TransferResumeSupportState.Off;
        //SFTP File Path
        Sftp_RemotePath = ConfigurationManager.AppSettings["SFTPFileName"].ToString();
        //Delete File if Exist
        if (System.IO.File.Exists(FilePath))
        {
            System.IO.File.Delete(FilePath);
        }
        //the parameter list is: remote Path, Local Path with filename 
        TransferOperationResult transferOperationResult = session.GetFiles(Sftp_RemotePath, FilePath , false, transferOptions);

        //Throw on any error 
        transferOperationResult.Check();
        Debug.WriteLine("Downloaded fresh sales data file!");
    }
}

我正在使用MVC并且有两个访问此类的控制器。当我一次运行一个控制器然后它工作正常但当我同时运行两个控制器然后我在一个控制器中得到这个错误:

WinSCP.SessionRemoteException: Can't create file 'D:\TESTING\SFTP\Data.csv'. ---> WinSCP.SessionRemoteException: System Error.
  Code: 32.
The process cannot access the file because it is being used by another process
   --- End of inner exception stack trace ---
   at WinSCP.OperationResultBase.Check()
   at JetStarAPI.Models.SFTPClient.DownloadFile(String FilePath) in D:\TESTING\SFTP\Models\SFTPClient.cs:line 65}

我在此行之后收到此错误

 transferOperationResult.Check();

如果我在这里更改文件的名称

   TransferOperationResult transferOperationResult = session.GetFiles(Sftp_RemotePath, FilePath+Path.GetRandomFileName() , false, transferOptions);

它工作正常并使用随机文件名保存文件,但我想传递我的FileName。怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

static bool IsDownloadInProgress = false;

    public static string DownloadFile(string FilePath)
    {

        string SalesStatus = "ok";
        try
        {

            if (!File.Exists(FlagFilePath) &&  !IsDownloadInProgress)
            {
                Debug.WriteLine("Trying to download sales data file ");

                SessionOptions sessionOptions = new SessionOptions
                {
                    Protocol = Protocol.Sftp,
                    HostName = ConfigurationManager.AppSettings["SFTPDomain"],
                    UserName = ConfigurationManager.AppSettings["SFTPUser"],
                    Password = ConfigurationManager.AppSettings["SFTPPass"],
                    PortNumber = Convert.ToInt32(ConfigurationManager.AppSettings["SFTPPortNumber"]),
                    GiveUpSecurityAndAcceptAnySshHostKey = true,

                };

                using (Session session = new Session())
                {

                    //Attempts to connect to your SFtp site
                    session.Open(sessionOptions);

                    //Get SFtp File
                    TransferOptions transferOptions = new TransferOptions();
                    transferOptions.TransferMode = TransferMode.Binary; //The Transfer Mode - Automatic, Binary, or Ascii 
                    transferOptions.FilePermissions = null;  //Permissions applied to remote files; 
                    transferOptions.PreserveTimestamp = false;  //Set last write time of destination file 
                    //to that of source file - basically change the timestamp to match destination and source files.    
                    transferOptions.ResumeSupport.State = TransferResumeSupportState.On;
                    //SFTP File Path
                    Sftp_RemotePath = ConfigurationManager.AppSettings["SFTPFileName"].ToString();
                    //Delete File if Exist
                    if (System.IO.File.Exists(FilePath))
                    {
                        System.IO.File.Delete(FilePath);
                    }
  //Throw on any error 
                   session.FileTransferred += OnFileTransferComplete;
                   IsDownloadInProgress = true;

                    //the parameter list is: remote Path, Local Path with filename 
                //    string result = Path.GetRandomFileName();
                   session.GetFiles(Sftp_RemotePath,FilePath,false,  transferOptions).Check();


                    session.Dispose();
                  //  File.Move(FilePath, "foo2.png");
                    Debug.WriteLine("Downloaded fresh sales data file!");
                }
            }
        }

        catch (Exception ex)
        {

            string _errorMsg = "";
            // Setting Sales Status values
            if (ex.InnerException != null)
            {
                if (ex.InnerException.Message.Contains("Authentication failed"))
                {
                    _errorMsg = ex.InnerException.Message;
                    Debug.WriteLine("wrong username/password");
                    SalesStatus = "2";
                }
                else if (ex.InnerException.Message.Contains("No such file or directory"))
                {
                    _errorMsg = ex.InnerException.Message;
                    Debug.WriteLine("File is not Available");
                    SalesStatus = "3";
                }
            }
            else
            {
                _errorMsg = ex.Message;
                Debug.WriteLine("General SFTP Error");
                SalesStatus = "4";
            }


            //Create log error file
            if (!File.Exists(FlagFilePath))
            {
                // create SFTP LocalErrorFlag
                Debug.WriteLine("Creating SFTP flag file");
                System.IO.File.WriteAllText(FlagFilePath, "SFTP Error: " + _errorMsg);
            }
            else
            {
                Debug.WriteLine("SFTP error Flag file already exists");
            }


        }
        return SalesStatus;
    }

    private static void OnFileTransferComplete(object sender, TransferEventArgs e)
    {
        IsDownloadInProgress = false;
        ((Session)sender).FileTransferred -= OnFileTransferComplete;
    }