2016-05-29 10 views
1

私は自動に私のDropboxからフォルダ全体をダウンロードしています - ストレージを、Webリンクの例を経由して:ちょうど基本的なWebクライアントとhttps://www.dropbox.com/sh/bunchOfLetters/somthnsomthn?dl=1のDropboxフォルダのダウンロードの問題(C#の)

using (WebClient wc = new WebClient()) 
{ 
    wc.DownloadFile(new Uri(uri), _basePath + localPath); 
} 

フォルダnaturalyが来ます(?) (Dropboxのダウンロードシステムのために).rarファイルとして、そして私が手動で(Winrar経由で)ファイルを開こうとすると、全く問題はありません。今すぐ問題が発生します....もし私がダウンロードしてもらえなかったか、ファイルがちょうど壊れてしまったように、私は任意の種類の自動化されたlibary(unrarやSharpCompressのような)を使ってみると、常に 'Corupted Header' Winrarで開くとうまくいく。

誰にでもどのように、なぜその理由があるのか​​。私はあなたの考えを聞くのにすばらしいと思います。

編集:ここ

iがSharpCompressに使用する機能です。

public static bool ExtractToFolder(string extractionPackage, string outputPath) 
     { 
      if (extractionPackage == null) throw new ArgumentNullException(nameof(extractionPackage)); 
      if (outputPath == null) throw new ArgumentNullException(nameof(outputPath)); 
      if (string.IsNullOrEmpty(extractionPackage)) 
       throw new ArgumentException("Argument is null or empty", nameof(extractionPackage)); 
      if (string.IsNullOrEmpty(outputPath)) 
       throw new ArgumentException("Argument is null or empty", nameof(outputPath)); 
      if (!extractionPackage.EndsWith(".rar")) throw new InvalidDataException("not a .rar File"); 
      Directory.CreateDirectory(outputPath); 

      try 
      { 
       using (Stream stream = File.OpenRead(extractionPackage)) 
       using (RarReader reader = RarReader.Open(stream)) 
       { 
        while (reader.MoveToNextEntry()) 
        { 
         reader.WriteEntryToDirectory(outputPath, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite); 
        } 
       } 

       return true; 
      } 
      catch 
      { 
       return false; 
      } 
     } 

と誰かがのunrar 1に関心がある場合: ..私はまだよくやっていない知っているが、それ普通のファイルで動作します... Dropboxのものはありません

namespace Cryptus.Rar 
{ 
/// <summary> 
/// just for compatibility purposes, use <see cref="SharpCompress"/> 
/// </summary> 
public class Unrar 
{ 
    public enum RarOperations 
    { 
     OP_EXTRACT = 0, 
     OP_TEST = 1, 
     OP_LIST = 2 
    } 

    public const int ERAR_END_ARCHIVE = 10; 
    public const int ERAR_NO_MEMORY = 11; 
    public const int ERAR_BAD_DATA = 12; 
    public const int ERAR_BAD_ARCHIVE = 13; 
    public const int ERAR_UNKNOWN_FORMAT = 14; 
    public const int ERAR_EOPEN = 15; 
    public const int ERAR_ECREATE = 16; 
    public const int ERAR_ECLOSE = 17; 
    public const int ERAR_EREAD = 18; 
    public const int ERAR_EWRITE = 19; 
    public const int ERAR_SMALL_BUF = 20; 

    public const int RAR_OM_LIST = 0; 
    public const int RAR_OM_EXTRACT = 1; 

    public const int RAR_SKIP = 0; 
    public const int RAR_TEST = 1; 
    public const int RAR_EXTRACT = 2; 

    public const int RAR_VOL_ASK = 0; 
    public const int RAR_VOL_NOTIFY = 1; 

    [DllImport("unrar.dll")] 
    public static extern IntPtr RAROpenArchive(ref RAROpenArchiveData ArchiveData); 

    [DllImport("unrar.dll")] 
    public static extern int RARCloseArchive(IntPtr hArcData); 

    [DllImport("unrar.dll")] 
    public static extern int RARReadHeader(IntPtr hArcData, ref RARHeaderData HeaderData); 

    [DllImport("unrar.dll")] 
    public static extern IntPtr RAROpenArchiveEx(ref RAROpenArchiveDataEx ArchiveData); 

    [DllImport("unrar.dll")] 
    public static extern int RARReadHeaderEx(IntPtr hArcData, ref RARHeaderDataEx HeaderData); 

    [DllImport("unrar.dll")] 
    public static extern int RARProcessFile(IntPtr hArcData, int Operation, string DestPath, string DestName); 

    [DllImport("unrar.dll")] 
    public static extern int RARGetDllVersion(); 

    [DllImport("user32.dll")] 
    private static extern bool CharToOem(string lpszSrc, [Out] StringBuilder lpszDst); 

    /// <summary> 
    ///  opens an arcive and unloads its content to destDolder 
    /// </summary> 
    /// <param name="strFileName">input .rar File</param> 
    /// <param name="destFolder">destination Folder</param> 
    public void UnloadArchieve(string strFileName, string destFolder) 
    { 
     IntPtr lHandle; 
     int iStatus; 
     RAROpenArchiveData uRAR = new RAROpenArchiveData(); 
     RARHeaderData uHeader = new RARHeaderData(); 

     uRAR.ArcName = strFileName + char.MinValue; 
     uRAR.OpenMode = RAR_OM_EXTRACT; 
     uRAR.CmtBuf = null; 

     string ExtractDir = Path.GetDirectoryName(strFileName); 
     StringBuilder sbDir = new StringBuilder(); 
     CharToOem(destFolder, sbDir); 

     lHandle = RAROpenArchive(ref uRAR); 
     if (uRAR.OpenResult != 0) 
      Console.Write("Unable to open the Archieve!!!"); 
     while (RARReadHeader(lHandle, ref uHeader) == 0) 
     { 
      int result = RARProcessFile(lHandle, 2, sbDir.ToString(), null); 
      if (0 != result) 
       Console.Write("Unable to open the Archieve!!!"); 
     } 


     iStatus = RARCloseArchive(lHandle); 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct RARHeaderData 
    { 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
     public string ArcName; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
     public string FileName; 
     public uint Flags; 
     public uint PackSize; 
     public uint UnpSize; 
     public uint HostOS; 
     public uint FileCRC; 
     public uint FileTime; 
     public uint UnpVer; 
     public uint Method; 
     public uint FileAttr; 
     public string CmtBuf; 
     public uint CmtBufSize; 
     public uint CmtSize; 
     public uint CmtState; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct RAROpenArchiveData 
    { 
     public string ArcName; 
     public uint OpenMode; 
     public uint OpenResult; 
     public string CmtBuf; 
     public uint CmtBufSize; 
     public uint CmtSize; 
     public uint CmtState; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct RAROpenArchiveDataEx 
    { 
     public string ArcName; 
     public string ArcNameW; 
     public uint OpenMode; 
     public uint OpenResult; 
     public string CmtBuf; 
     public uint CmtBufSize; 
     public uint CmtSize; 
     public uint CmtState; 
     public uint Flags; 
     public uint Reserved; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct RARHeaderDataEx 
    { 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
     public string ArcName; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
     public string FileName; 
     public string FileNameW; 
     public uint Flags; 
     public uint PackSize; 
     public uint PackSizeHigh; 
     public uint UnpSize; 
     public uint UnpSizeHigh; 
     public uint HostOS; 
     public uint FileCRC; 
     public uint FileTime; 
     public uint UnpVer; 
     public uint Method; 
     public uint FileAttr; 
     public string CmtBuf; 
     public uint CmtBufSize; 
     public uint CmtSize; 
     public uint CmtState; 
     public uint Reserved; 
    } 
} 
+0

例外をスローするコードを教えてください。 – whymatter

+0

'.rar'ファイルの例を提供できますか? Dropboxはzipファイルしか作成していないと思った。 – smarx

+0

@whymatterそのコードのようなものではありません、すべての他の.rarファイルのために働いています。そのDropboxの自動化されたものではありません... SharpCompress functon –

答えて

0

Okだから、@smarxは彼のcomme nt!その少し奇妙ですが、Dropboxは、rarではなくzipヘッダーを含む.rarファイルを生成します。これはヘッダー形式の自動検出の任意の形式では問題ありませんが、rar抽出方法(.rarファイルに使用する必要があります)を使用すると動作しません。

関連する問題