2014-11-19 3 views
1

Может кто-нибудь сказать мне, как избавиться от ошибкиФайл используется другой ошибки процесса

Процесс не может получить доступ к файлу, так как он используется другим процессом

Вот мой код

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. Как это решить?

+0

Вам необходимо убедиться, что у вас нет открытого файла в коде или в каком-либо другом приложении. В Google для этой ошибки появится целый ряд примеров. – Xcelled194

+0

работает отлично для одного запроса, но когда я удаляю оба контроллера вместе, я получаю эту ошибку, и это строка TransferOperationResult transferOperationResult = session.GetFiles (Sftp_RemotePath, FilePath, false, transferOptions); когда я изменяю FilePath на FilePath + Path.GetRandomFileName(), он работает – user3754674

+0

Да, потому что один контроллер уже открыл и заблокировал файл, а другой * пытается * открыть его в одно и то же время, что приведет к этому исключению. По сути, вы пытаетесь открыть файл дважды. Ваше GetRandomFileName работает, потому что каждый контроллер получает другой результат от этого метода, и поэтому каждый обращается к другому файлу. – Xcelled194

ответ

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; 
    } 
+0

@ спасибо, но я использую Winscp для загрузки из SFTP и нет .FileTransferred method: $ – user3754674

+0

@ user3754674 это событие в классе Session, а не метод. Пожалуйста, проверьте это http://winscp.net/rus/docs/library_session_filetransferred –

+0

Я отредактировал ваш код, и я использую вот так, но все-таки та же ошибка, я делаю это правильно? – user3754674

Смежные вопросы