2014-11-19 7 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); 

파일의 이름을 변경하는 경우 그것은 잘 작동하고 임의의 파일 이름으로 파일을 저장하지만 난 내 이름을 전달하려는. 어떻게 해결할 수 있을까요?

+0

코드 나 다른 응용 프로그램에서 이미 파일을 열지 않았는지 확인해야합니다. 이 오류에 대한 인터넷 검색은 여러 가지 예를 보여줍니다. – 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

@ 감사하지만 SFTP에서 다운로드 Winscp를 사용하고 거기에 .FileTransferred 메서드가 없습니다 : $ – user3754674

+0

@ user3754674 그것은 세션 클래스에서 이벤트가 아닌 방법입니다. 이것을 확인하십시오 http://winscp.net/eng/docs/library_session_filetransferred –

+0

나는 당신의 코드를 편집했고 이것과 같이 사용하고 있습니다. 그러나 여전히 똑같은 오류는 올바르게하고 있습니까? – user3754674