2016-05-29 1 views
1

Je télécharge automatiquement un dossier entier de mon Dropbox - stockage, via par exemple WebLink (?): https://www.dropbox.com/sh/bunchOfLetters/somthnsomthn?dl=1 avec juste un webclient de base:dossier Dropbox numéro de téléchargement (C#)

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

Le dossier vient naturaly en tant que fichier .rar (en raison du système de téléchargement de Dropbox), et si j'essaie d'ouvrir le fichier manuellement (via Winrar), il n'y a aucun problème. Maintenant, le problème ... si j'essaie d'utiliser n'importe quel type de librairie automatisée (comme unrar ou SharpCompress), il me donne toujours un 'entête corupté' comme si le téléchargement n'aurait pas été tout simplement ou le fichier juste cassé ..mais encore l'ouvrir avec Winrar fonctionne très bien.

Si quelqu'un a une idée de comment et pourquoi; Je serais très heureux d'entendre vos pensées.

Edit:

ici est la fonction que j'utilise pour 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; 
      } 
     } 

et si quelqu'un est intéressé par une unrar: ..Je savent pas bien son fait mais encore fonctionne pour les fichiers normaux ... juste pas Dropbox ceux

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

Pourriez-vous nous indiquer le code qui lève l'exception? – whymatter

+0

Pouvez-vous fournir un exemple de fichier '.rar'? Je pensais que Dropbox ne produisait que des fichiers zip. – smarx

+0

@whymatter son pas comme le code ne fonctionne pas du tout, dans fackt son travail bien pour tous les autres fichiers .rar .. tout simplement pas l'automate de Dropbox ... encore mal l'application SharpCompress –

Répondre

0

Ok, donc il semble que @smarx avait raison avec son comme NT! C'est un peu étrange, mais Dropbox génère des fichiers .rar qui ne contiennent pas un rar, mais un en-tête zip. Cela ne pose aucun problème pour toute forme de détection automatique du format d'en-tête, mais si vous utilisez une méthode d'extraction de rar (qui devrait être utilisée pour les fichiers .rar ..) cela ne marchera pas.