11
votes

Copier des ressources intégrées comme fichier sur disque en C #

J'ai un fichier INF enregistré comme une ressource intégrée dans mon projet C #. J'essaie d'enregistrer ce fichier dans un lieu local à la demande. J'utilise cette méthode.

public static void SaveResourceToDisk(string ResourceName, string FileToExtractTo)
{
    Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(ResourceName);
    FileStream resourceFile = new FileStream(FileToExtractTo, FileMode.Create);

    byte[] b = new byte[s.Length + 1];
    s.Read(b, 0, Convert.ToInt32(s.Length));
    resourceFile.Write(b, 0, Convert.ToInt32(b.Length - 1));
    resourceFile.Flush();
    resourceFile.Close();

    resourceFile = null;
}


3 commentaires

Si vous avez posté l'erreur complète (y compris le numéro de ligne, correspondant au numéro de ligne de votre code), cela peut aider à diagnostiquer le problème.


Un conseil latéral: envisagez d'utiliser le mot-clé "Utilisation" avec vos objets pour les éliminer automatiquement.


Dupliquer de Stackoverflow. com / questions / 864140 / ... , qui a un exemple de code plus utile.


5 Réponses :


12
votes

Vous pouvez appeler xxx pré>

et inspecter les ressources intégrées accessibles. Ensuite, vous pouvez comparer cela contre ce que vous passez pour voir si vous accomplissez en effet ce que vous attendiez. P>

En outre, vous devez envisager l'utilisation de mots-clés pour disposer de vos flux: P>

using(FileStream ResourceFile = new FileStream(FileToExtractTo, FileMode.Create))
{
    //do stuff
}


1 commentaires

OK, j'ai compris. J'utilisais getManifestresourceestream (nomspace.resourcename) Quand j'aurais dû être usaint getManifestresourcetream (nomspace.resources.resourcename) . Et merci pour le en utilisant Astuce!



5
votes

C'est le moyen le plus simple d'enregistrer une ressource intégrée: xxx


0 commentaires

1
votes

Déballez toutes les ressources intégrées dans un assemblage et les sauve les côtés de l'ensemble contenant cette classe tout en maintenant la structure de répertoire. Ce code ne nécessite pas de savoir quoi que ce soit sur les fichiers contenus dans l'assemblage et constitue une solution plus générique, mais il suppose que tous les fichiers ont des extensions de fichier.

public class EmbeddedResources
{
    private bool isUnpacked = false;

    public async Task EnsureUnpacked(string saveDirectory)
    {
        if (!this.isUnpacked)
        {
            var assembly = Assembly.GetExecutingAssembly();
            var assemblyDirectory = Path.GetDirectoryName(assembly.Location);
            foreach (var name in assembly.GetManifestResourceNames())
            {
                var stream = assembly.GetManifestResourceStream(name);

                var stringBuilder = new StringBuilder();
                var parts = name
                    .Replace(typeof(EmbeddedResources).Namespace + ".", string.Empty)
                    .Split('.')
                    .ToList();
                for (int i = 0; i < parts.Count; ++i)
                {
                    var part = parts[i];
                    if (string.Equals(part, string.Empty))
                    {
                        stringBuilder.Append(".");      // Append '.' in file name.
                    }
                    else if (i == parts.Count - 2)
                    {
                        stringBuilder.Append(part);     // Append file name and '.'.
                        stringBuilder.Append('.');
                    }
                    else if (i == parts.Count - 1)
                    {
                        stringBuilder.Append(part);     // Append file extension.
                    }
                    else
                    {
                        stringBuilder.Append(part);     // Append file path.
                        stringBuilder.Append('\\');
                    }
                }

                var filePath = Path.Combine(saveDirectory, stringBuilder.ToString());
                using (FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {
                    await stream.CopyToAsync(fileStream);
                }
            }

            this.isUnpacked = true;
        }
    }
}


0 commentaires

0
votes

Joindre votre fichier dans votre projet. Cliquez sur le fichier ci-joint.go à Propriétés, définissez Définir l'action Création de la ressource intégrée, utilisez le nom du fichier dans le code comme celui-ci: «YourprojectName.yourfilenameiwithext»


0 commentaires

0
votes

J'ai eu un fichier Excel ajouté dans mon ressources code> et n'avait pas de chance en utilisant les solutions d'autres. Ceci était dû au fichier lui-même est accessible en tant que octet [] code> via les propriétés .resources.Resources code> au lieu de ramasser le routage du chemin de chaîne.

Donc, donc je demande simplement à la Utilisateur pour un chemin d'économie puis j'utilise le system.io.file.file.file.file.file.file.file.file.file.file.file.file.file.fle.flytees code> Méthode : P>

using (var save = new SaveFileDialog())
{
    save.Title = "File path for saving the file";
    save.FileName = "Excel file.xlsx";
    save.Filter = "Excel files|*.xlsx;*.xls";
    var dialog = save.ShowDialog();
    if (dialog != DialogResult.OK)
        return;

    System.IO.File.WriteAllBytes(save.FileName, Resources.ExcelFile);
}


0 commentaires