2012-09-21 51 views
1

以下行引發異常。我不知道爲什麼。例外:使用FileStream時訪問被拒絕

using (var output = new FileStream(sftpFile.Name, FileMode.Create,FileAccess.ReadWrite)) 

的例外是:

Error: System.UnauthorizedAccessException: Access to the path 'C:\Users\roberth\ 
Programming_Projects\Common\UI\bin\Debug' is denied. 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, 
Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions 
options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, 
Boolean useLongPath, Boolean checkHost) 
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access) 
    at CWD.Networking.DownloadFromSftp(String hostname, String user, String passw 
ord, Int32 port, String localPath, String remotePath, String filename) in c:\Use 
rs\roberth\Programming_Projects\Common\Common\Common.cs:line 566 

線566上方的using語句。

任何人都可以闡明爲什麼我可能會觸發錯誤嗎?我對該目錄擁有完全權限,沒有編譯問題,我也可以在該目錄中手動創建新的文件和文件夾。

- 編輯 -

我試圖運行VS管理員爲沒有決議的建議。

+0

如果您正在使用UAC(用戶帳戶控制)運行,確保Visual Studio以管理員身份啓動。 – Arran

+0

@Arran我們是,讓我試試管理員 –

+0

你可以發佈'sftpFile.Name'嗎? (實際值,而不是你期望的值)具有該名稱的文件(或目錄)是否已經存在?例如,如果將文件名添加到路徑失敗,並且因此指向父目錄,您會遇到一些錯誤。 – CodesInChaos

回答

6

UnauthorizedAccessException錯誤信息告訴你它是什麼文件,你正在試圖打開:

C:\Users\roberth\Programming_Projects\Common\UI\bin\Debug 

這看起來像一個目錄名:無法打開一個目錄作爲一個文件。

你大概忘了追加文件名:

string filename = Path.Combine(sftpFile.Name, "SomeFile.dat"); 
using (var output = new FileStream(filename,...) 
{ 
    ... 
} 
+0

有趣 - 如果我手動指定名稱,但是如果我嘗試將它傳遞給sftp服務器上的文件名,它會失敗。猜猜我還有一些工作要做:) –

1

您需要使用類似下面的東西:

private bool EnviarArchivoSFTP(string PuertoSFTP, string UrlFTP, string CarpetaFTP, string UsuarioFTP, string PasswordFTP, string FicheroFTP, string nombreArchivo) 
{ 
    bool archivoEnviado = false; 

    using (var client = new SftpClient(UrlFTP, int.Parse(PuertoSFTP), UsuarioFTP, PasswordFTP)) 
    { 
     client.ConnectionInfo.Timeout = TimeSpan.FromSeconds(1); 
     client.OperationTimeout = TimeSpan.FromSeconds(1); 
     client.Connect(); 
     client.ChangeDirectory(CarpetaFTP); 

     string dataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
     string appFile = Path.Combine(dataPath, FicheroFTP, nombreArchivo);//Se brindan permisos full sobre la carpeta 

     using (var fileStream = new FileStream(appFile, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) 
     { 
      client.BufferSize = 4 * 1024; // bypass Payload error large files 
      client.UploadFile(fileStream, Path.GetFileName(nombreArchivo)); 
      archivoEnviado = true; 
     } 
    } 
    return archivoEnviado; 
} 
+0

你的回答幫助我解決了我的問題。在我的情況下,我明確地使用了對文件的讀取權限: 使用(Stream fileStream = new FileStream(reportPathAndName,FileMode.Open,FileAccess.Read,FileShare.Read)) –