2014-04-12 74 views
1

我需要一些幫助,我的代碼,我已經創建了一個Visual Basic程序,將文件和目錄從本地驅動器複製到網絡共享,但我不斷收到一個錯誤,指出訪問路徑C:\Users\*username*\Documents\My Music被拒絕。即使我在Documents目錄中沒有名爲My Music的子目錄。任何幫助,將不勝感激。這裏是我的代碼如下:複製目錄時的權限問題

Imports System.IO 

Public Class Choices 
    Private Sub Choices_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    End Sub 

    Public Sub btnDocuments_Click(sender As Object, e As EventArgs) Handles btnDocuments.Click 
     Dim docsDirectory, destdocsDirectory, userDirectory, userName, hDrive, mydocsDirectory, destmydocsDirectory As String 
     'Function to pull user profile path 
     hDrive = Environment.GetEnvironmentVariable("homedrive") 
     userName = Environment.GetEnvironmentVariable("username") 
     userDirectory = Environment.GetEnvironmentVariable("userprofile") 
     docsDirectory = userDirectory + "\Documents" 
     destdocsDirectory = hDrive + userName + "\My Files" 
     mydocsDirectory = "C:\My Documents" 
     destmydocsDirectory = hDrive + userName + "\My Documents" 

     'Used for error checking 
     'MessageBox.Show(sourceDirectory + vbCrLf + destDirectory) 

     If (My.Computer.FileSystem.DirectoryExists(destdocsDirectory)) Then 
      For Each foundFile As String In My.Computer.FileSystem.GetFiles(docsDirectory, _ 
        FileIO.SearchOption.SearchAllSubDirectories, "*.*") 
       Select Case LCase(Path.GetExtension(foundFile)) 
        Case ".mks" 
        Case ".wav" 
        Case ".jpg" 
        Case ".wmv" 
        Case ".lnk" 
        Case ".png" 
        Case ".exe" 
        Case ".jpeg" 
        Case ".dll" 
        Case ".msi" 
        Case ".bmp" 
        Case ".url" 
        Case ".log" 
        Case ".dat" 
        Case ".ini" 
        Case ".propdesc" 
        Case ".arx" 
        Case ".hdi" 
        Case ".mc3" 
        Case ".css" 
        Case ".gif" 
        Case ".tif" 
        Case ".tiff" 
        Case ".htm" 
        Case ".chm" 
        Case ".pc3" 
        Case ".mp3" 
        Case ".mp4" 
        Case Else 
         My.Computer.FileSystem.CopyFile(foundFile, destdocsDirectory & "\" & Path.GetFileName(foundFile), showUI:=FileIO.UIOption.AllDialogs) 
       End Select 
      Next 
     Else 
      My.Computer.FileSystem.CreateDirectory(destdocsDirectory) 
      For Each foundFile As String In My.Computer.FileSystem.GetFiles(docsDirectory, _ 
        FileIO.SearchOption.SearchAllSubDirectories, "*.*") 
       Select Case LCase(Path.GetExtension(foundFile)) 
        Case ".mks" 
        Case ".wav" 
        Case ".jpg" 
        Case ".wmv" 
        Case ".lnk" 
        Case ".png" 
        Case ".exe" 
        Case ".jpeg" 
        Case ".dll" 
        Case ".msi" 
        Case ".bmp" 
        Case ".url" 
        Case ".log" 
        Case ".dat" 
        Case ".ini" 
        Case ".propdesc" 
        Case ".arx" 
        Case ".hdi" 
        Case ".mc3" 
        Case ".css" 
        Case ".gif" 
        Case ".tif" 
        Case ".tiff" 
        Case ".htm" 
        Case ".chm" 
        Case ".pc3" 
        Case ".mp3" 
        Case ".mp4" 
        Case Else 
         My.Computer.FileSystem.CopyFile(foundFile, destdocsDirectory & "\" & Path.GetFileName(foundFile), showUI:=FileIO.UIOption.AllDialogs) 
       End Select 
      Next 
     End If 

     If (My.Computer.FileSystem.DirectoryExists(mydocsDirectory)) Then 
      For Each foundFile As String In My.Computer.FileSystem.GetFiles(mydocsDirectory, _ 
        FileIO.SearchOption.SearchAllSubDirectories, "*.*") 
       Select Case LCase(Path.GetExtension(foundFile)) 
        Case ".mks" 
        Case ".wav" 
        Case ".jpg" 
        Case ".wmv" 
        Case ".lnk" 
        Case ".png" 
        Case ".exe" 
        Case ".jpeg" 
        Case ".dll" 
        Case ".msi" 
        Case ".bmp" 
        Case ".url" 
        Case ".log" 
        Case ".dat" 
        Case ".ini" 
        Case ".propdesc" 
        Case ".arx" 
        Case ".hdi" 
        Case ".mc3" 
        Case ".css" 
        Case ".gif" 
        Case ".tif" 
        Case ".tiff" 
        Case ".htm" 
        Case ".chm" 
        Case ".pc3" 
        Case "." 
        Case Else 
         My.Computer.FileSystem.CopyFile(foundFile, destmydocsDirectory & "\" & Path.GetFileName(foundFile), showUI:=FileIO.UIOption.AllDialogs) 
       End Select 
      Next 
     Else 
      MessageBox.Show(mydocsDirectory + "Does not exist") 
     End If 
    End Sub 

    Private Sub btnDesktop_Click(sender As Object, e As EventArgs) Handles btnDesktop.Click 
     Dim deskDirectory, destdeskDirectory, userDirectory, userName, hDrive As String 
     hDrive = Environment.GetEnvironmentVariable("homedrive") 
     userName = Environment.GetEnvironmentVariable("username") 
     userDirectory = Environment.GetEnvironmentVariable("userprofile") 
     deskDirectory = userDirectory + "\Desktop" 
     destdeskDirectory = hDrive + userName + "\Desktop" 
     If (My.Computer.FileSystem.DirectoryExists(deskDirectory)) Then 
      For Each foundFile As String In My.Computer.FileSystem.GetFiles(deskDirectory, _ 
        FileIO.SearchOption.SearchAllSubDirectories, "*.*") 
       Select Case LCase(Path.GetExtension(foundFile)) 
        Case ".mks" 
        Case ".wav" 
        Case ".jpg" 
        Case ".wmv" 
        Case ".lnk" 
        Case ".png" 
        Case ".exe" 
        Case ".jpeg" 
        Case ".dll" 
        Case ".msi" 
        Case ".bmp" 
        Case ".url" 
        Case ".log" 
        Case ".dat" 
        Case ".ini" 
        Case ".propdesc" 
        Case ".arx" 
        Case ".hdi" 
        Case ".mc3" 
        Case ".css" 
        Case ".gif" 
        Case ".tif" 
        Case ".tiff" 
        Case ".htm" 
        Case ".chm" 
        Case ".pc3" 
        Case "." 
        Case Else 
         My.Computer.FileSystem.CopyDirectory(foundFile, destdeskDirectory & "\" & Path.GetFileName(foundFile), showUI:=FileIO.UIOption.AllDialogs) 
       End Select 
      Next 
     End If 
    End Sub 
End Class 
+0

您可以用http://msdn.microsoft.com/en-us/library/14tx8hby%28v=vs.110%29.aspx – SomeNickName

回答

1

該目錄被稱爲Music。通過一些魔術窗口顯示它爲My Music。嘗試使用物理名稱Music

My DocumentsDocuments存在類似的問題。

如果需要當前用戶的文檔目錄,你可以用

destmydocsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 

得到它,如果你要訪問其他用戶的目錄,你需要一個管理員,否則你不會通常有權訪問它們!


您聲明瞭幾次相同的冗長的Select Case列表。

Private m_mediaExtensions As New HashSet(Of String)() From { ".mks", ".wav", ... } 

然後你就可以測試

If m_mediaExtensions.Contains(myExtension) Then 
    ... 
Else 
    ... 
End If 

注:在VB因爲VS2010存在集合初始化,如果你把所有的擴展在HashSet(Of String)這將是更容易管理。在效應初探

m_mediaExtensions = New HashSet(Of String)(New String() {".mks", ".wav", ...}) 

UPDATE到您的評論:對於早期版本,你可以通過枚舉的構造函數。注意:我還沒有糾正路徑。

Imports System.IO 

Public Class Choices 
    Private m_mediaExtensions As HashSet(Of String) = _ 
     New HashSet(Of String)(New String() {".mks", ".wav", ".jpg"}) 

    Public Sub btnDocuments_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnDocuments.Click 
     Dim docsDirectory, destdocsDirectory, userDirectory, userName, hDrive, mydocsDirectory, destmydocsDirectory As String 
     'Function to pull user profile path 
     hDrive = Environment.GetEnvironmentVariable("homedrive") 
     userName = Environment.GetEnvironmentVariable("username") 
     userDirectory = Environment.GetEnvironmentVariable("userprofile") 
     docsDirectory = userDirectory + "\Documents" 
     destdocsDirectory = hDrive + userName + "\My Files" 
     mydocsDirectory = "C:\My Documents" 
     destmydocsDirectory = hDrive + userName + "\My Documents" 

     'Used for error checking 
     'MessageBox.Show(sourceDirectory + vbCrLf + destDirectory) 

     If Not Directory.Exists(destdocsDirectory) Then 
      My.Computer.FileSystem.CreateDirectory(destdocsDirectory) 
     End If 
     For Each foundFile As String In My.Computer.FileSystem.GetFiles(docsDirectory, _ 
      FileIO.SearchOption.SearchAllSubDirectories, "*.*") 
      If Not m_mediaExtensions.Contains(LCase(Path.GetExtension(foundFile))) Then 
       My.Computer.FileSystem.CopyFile(foundFile, destdocsDirectory & "\" & Path.GetFileName(foundFile), showUI:=FileIO.UIOption.AllDialogs) 
      End If 
     Next 

     If Directory.Exists(mydocsDirectory) Then 
      For Each foundFile As String In My.Computer.FileSystem.GetFiles(mydocsDirectory, _ 
       FileIO.SearchOption.SearchAllSubDirectories, "*.*") 
       If Not m_mediaExtensions.Contains(LCase(Path.GetExtension(foundFile))) Then 
        My.Computer.FileSystem.CopyFile(foundFile, destmydocsDirectory & "\" & Path.GetFileName(foundFile), showUI:=FileIO.UIOption.AllDialogs) 
       End If 
      Next 
     Else 
      MessageBox.Show(mydocsDirectory + "Does not exist") 
     End If 
    End Sub 

    Private Sub btnDesktop_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnDesktop.Click 
     Dim deskDirectory, destdeskDirectory, userDirectory, userName, hDrive As String 
     hDrive = Environment.GetEnvironmentVariable("homedrive") 
     userName = Environment.GetEnvironmentVariable("username") 
     userDirectory = Environment.GetEnvironmentVariable("userprofile") 
     deskDirectory = userDirectory + "\Desktop" 
     destdeskDirectory = hDrive + userName + "\Desktop" 
     If Directory.Exists(deskDirectory) Then 
      For Each foundFile As String In My.Computer.FileSystem.GetFiles(deskDirectory, _ 
       FileIO.SearchOption.SearchAllSubDirectories, "*.*") 
       If Not m_mediaExtensions.Contains(LCase(Path.GetExtension(foundFile))) Then 
        My.Computer.FileSystem.CopyDirectory(foundFile, destdeskDirectory & "\" & Path.GetFileName(foundFile), showUI:=FileIO.UIOption.AllDialogs) 
       End If 
      Next 
     End If 
    End Sub 
End Class 
+0

切換您的目錄的使用出於某種原因,我有點困惑於我需要在哪裏插入Private M_mediaExtensions As New,代碼集。 – jfritts6524

+0

使其成爲「班級選擇」(任何「Sub」之外)的成員。如果您願意,也可以在'Sub New'中初始化它,而不是使用集合初始值設定項。 –

+0

當我嘗試在(myExtension)部分中輸入上面給出的代碼時,我得到一個錯誤,表明它沒有聲明。當我繼續爲它創建一個聲明並將其設置爲m_mediaExtensions作爲哈希集時,它說它不能被使用。 – jfritts6524