2012-01-03 12 views
0

ウェブのすべてのサブWebでコードをダウンロードしようとしていますが、何らかの理由で適切なディレクトリ構造が作成されませんでした。デバッグしようとしましたが、コードの後に​​、以下で与えられます。 OSローダーロックの内部管理の実行をしようと厄介な論理エラー

private void bFolder_Click(object sender, EventArgs e) 
    { 
     TreeNode currentNode = tvSource.SelectedNode; 
     SPObjectData objectData = (SPObjectData)currentNode.Tag; 
     using (SPWeb TopLevelWeb = objectData.Web) 
     { 
      string CurrentPath = tbDirectory.Text; 
      string FolderName = TopLevelWeb.Name; 
      dwnEachWeb(TopLevelWeb, CurrentPath, FolderName); 
     } 
    } 

    private void dwnEachWeb(SPWeb TopLevelWeb, string CurrentPath, string FolderName) 
    { 
     if (TopLevelWeb != null) 
     { 
      if (TopLevelWeb.Webs != null) 
      { 
       CreateDirectoryStructure(CurrentPath, FolderName); 

       dwnEachList(TopLevelWeb, CurrentPath, FolderName); 
       foreach (SPWeb ChildWeb in TopLevelWeb.Webs) 
       { 
        FolderName = ChildWeb.Name; 
        CurrentPath = CurrentPath + "\\" + FolderName; 
        dwnEachWeb(ChildWeb, CurrentPath, FolderName); 
        ChildWeb.Dispose(); 
       } 
      } 
     } 
    } 

    private void dwnEachList(SPWeb oWeb, string CurrentPath, string FolderName) 
    { 
     foreach (SPList oList in oWeb.Lists) 
     { 
      if (oList is SPDocumentLibrary && !oList.Hidden) 
      { 
       CurrentPath = CurrentPath + "//" + oList.Title; 
       FolderName = oList.Title; 
       CreateDirectoryStructure(CurrentPath, FolderName); 
       dwnEachFile(oList.RootFolder, CurrentPath, FolderName); 
      } 
     } 
    } 

    /*private void dwnEachFolder(SPFolder oFolder) 
    { 
     if (oFolder.SubFolders.Count == 0) 
     { 
      dwnEachFile(oFolder); 
     } 
     foreach (SPFolder SubFolder in oFolder.SubFolders) 
     { 
      dwnEachFolder(SubFolder); 
     } 
    }*/ 

    private void dwnEachFile(SPFolder oFolder, string CurrentPath, string FolderName) 
    { 
     if (oFolder.Files.Count != 0) 
     { 
      foreach (SPFile ofile in oFolder.Files) 
      { 
       if (CreateDirectoryStructure(CurrentPath, ofile.Url)) 
       { 
        var filepath = System.IO.Path.Combine(CurrentPath, ofile.Url); 
        byte[] binFile = ofile.OpenBinary(); 
        System.IO.FileStream fstream = System.IO.File.Create(filepath); 
        fstream.Write(binFile, 0, binFile.Length); 
        fstream.Close(); 
       } 
      } 
     } 
    } 

    //creating directory   
    private bool CreateDirectoryStructure(string baseFolder, string filepath) 
    { 
     if (!Directory.Exists(baseFolder)) return false; 

     var paths = filepath.Split('/'); 

     for (var i = 0; i < paths.Length - 1; i++) 
     { 
      baseFolder = System.IO.Path.Combine(baseFolder, paths[i]); 
      Directory.CreateDirectory(baseFolder); 
     } 
     return true; 
    } 

。 DllMainまたはイメージ初期化関数内でマネージコードを実行しようとしないでください。アプリケーションがハングアップする可能性があるためです。

エラーはオンラインで、 "dwnEachWeb(ChildWeb、CurrentPath、FolderName);"

しかし、私は例外を取得しないようにLoaderLockを無効にしないようにロジックを変更したい私のロジックが正しいかもしれない

+0

ではないかなり確信して、歓声 –

+3

私はエラーがあなたのロジックから来ていることを疑います - 管理されたコードとアンマネージライブラリの間のやりとりに関係する非常に特殊な例外です。 –

+0

ありがとうございましたが、私はすでにその問題が私の論理にあったと言いましたが、どうにか私はそれを解決しました。とにかく、ありがとう –

答えて

0
private void bFolder_Click(object sender, EventArgs e) 
{ 
    TreeNode currentNode = tvSource.SelectedNode; 
    SPObjectData objectData = (SPObjectData)currentNode.Tag; 
    using (SPWeb TopLevelWeb = objectData.Web) 
    { 
     dwnEachWeb(TopLevelWeb, TopLevelWeb.Title, tbDirectory.Text); 
    } 
} 

private void dwnEachWeb(SPWeb TopLevelWeb, string FolderName, string CurrentDirectory) 
    { 
     if (TopLevelWeb != null) 
     { 
      if (TopLevelWeb.Webs != null) 
      { 
       CurrentDirectory = CurrentDirectory + "//" + TopLevelWeb.Title; 
       CreateFolder(CurrentDirectory); 
       foreach (SPWeb ChildWeb in TopLevelWeb.Webs) 
       { 

        dwnEachWeb(ChildWeb, ChildWeb.Title, CurrentDirectory); 
        ChildWeb.Dispose(); 
       } 
       dwnEachList(TopLevelWeb, CurrentDirectory); 
       //dwnEachList(TopLevelWeb, FolderName, CurrentDirectory); 
      } 
     } 
    } 

    private void dwnEachList(SPWeb oWeb, string CurrentDirectory) 
    { 
     foreach (SPList oList in oWeb.Lists) 
     { 
      if (oList is SPDocumentLibrary && !oList.Hidden) 
      { 
       dwnEachFile(oList.RootFolder, CurrentDirectory); 
      } 
     } 
    } 

    private void dwnEachFile(SPFolder oFolder, string CurrentDirectory) 
    { 
     if (oFolder.Files.Count != 0) 
     { 
      CurrentDirectory = CurrentDirectory + "//" + oFolder.Name; 
      CreateFolder(CurrentDirectory); 
      foreach (SPFile ofile in oFolder.Files) 
      { 
       if (CreateDirectoryStructure(CurrentDirectory, ofile.Url)) 
       { 
        var filepath = System.IO.Path.Combine(CurrentDirectory, ofile.Url); 
        byte[] binFile = ofile.OpenBinary(); 
        System.IO.FileStream fstream = System.IO.File.Create(filepath); 
        fstream.Write(binFile, 0, binFile.Length); 
        fstream.Close(); 
       } 
      } 
     } 
    } 

    //creating directory where files will be download   
    private bool CreateDirectoryStructure(string baseFolder, string filepath) 
    { 
     if (!Directory.Exists(baseFolder)) return false; 

     var paths = filepath.Split('/'); 

     for (var i = 0; i < paths.Length - 1; i++) 
     { 
      baseFolder = System.IO.Path.Combine(baseFolder, paths[i]); 
      Directory.CreateDirectory(baseFolder); 
     } 
     return true; 
    } 

    //creating folders 
    private bool CreateFolder(string CurrentDirectory) 
    { 
     if (!Directory.Exists(CurrentDirectory)) 
     { 
      Directory.CreateDirectory(CurrentDirectory); 
     } 
     return true; 
    }