.NET face o copie a unei resurse de fișier încorporat pe unitatea locală

Sunt nou pe tărâm în ceea ce privește lucrul cu fișiere în .NET

Creez o aplicație WPF în VB.NET cu 3.5 Framework. (Dacă oferiți un exemplu în C#, este perfect.)

În proiectul meu am un șablon pentru o bază de date MS Access. Comportamentul meu dorit este că atunci când utilizatorii dau clic pe Fișier-->Nou, pot crea o nouă copie a acestui șablon, îi pot da un nume de fișier și îl pot salva în directorul lor local.

Baza de date are deja tabelele și câteva date de pornire necesare pentru interfața cu aplicația mea (un editor de date ușor de utilizat)

Mă gândesc că abordarea este de a include acest fișier „template.accdb” ca resursă în proiect și de a-l scrie într-un fișier cumva în timpul execuției?

Orice îndrumare va fi foarte, foarte apreciată.

Mulțumiri!


person Matt H.    schedule 08.04.2010    source sursă


Răspunsuri (7)


asigurați-vă că treceți numele complet calificat al spațiului de nume către ResourceName

Public Function ExtractResourceToDisk(ByVal ResourceName As String, ByVal FileToExtractTo As String) As Boolean

    Dim s As System.IO.Stream = System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream(ResourceName)
    Dim ResourceFile As New System.IO.FileStream(FileToExtractTo, IO.FileMode.Create)

    Dim b(s.Length) As Byte

    s.Read(b, 0, s.Length)
    ResourceFile.Write(b, 0, b.Length - 1)
    ResourceFile.Flush()
    ResourceFile.Close()

    ResourceFile = Nothing
End Function
person Greg Bogumil    schedule 08.04.2010

Ei bine, cel mai „ușor” lucru ar fi doar să îl includeți ca fișier de ieșire în instalarea programului dvs., astfel încât să fie instalat undeva atunci când aplicația dvs. o face (poate în directorul aplicației dvs. sau într-un subdirector în afara acestuia). Apoi puteți utiliza pur și simplu un File.Copy când trebuie să creați unul nou al șablonului. Nu susțin că aceasta este cea mai bună soluție, pur și simplu cea mai mică cantitate de muncă. Puteți citi mai multe despre metoda File.Copy aici.

person NebuSoft    schedule 08.04.2010

public static void WriteResourceToFile(Assembly assembly, Type scope, string resname, string path)
{
    Stream res = assembly.GetManifestResourceStream(scope, resname);
    using (FileStream file = new FileStream(path, FileMode.Create))
    {
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = res.Read(buffer, 0, buffer.Length)) > 0)
        {
            file.Write(buffer, 0, bytesRead);
        }
    }   
}

Ar trebui să facă truc. Unde domeniul de aplicare ar fi un domeniu de aplicare pentru numele resursei, care vă permite să scurtați numele resursei, care este complet calificat.

person Todd    schedule 08.04.2010

Unul la care am mai raspuns:

Noua bază de date Access, cum se poate face?

Interesant este o versiune piratată din VB-ul original, dar nu am VB-ul la îndemână (poveste lungă).

Aș merge puțin mai departe și aș sugera că doriți să vă creați și schema în cod - adică să aruncați o bază de date goală și apoi să creați schema din aceasta folosind DDL.

Această versiune C# și pentru SQL Server - din nou nu am versiunea access/vb.net la îndemână

Cum se creează încorporat Fișierul bazei de date SQL 2008 dacă nu există?

person Murph    schedule 08.04.2010

Am modificat răspunsul lui Greg Bogumil de mai sus pentru a crea o metodă de extensie. Acum, pe orice fișier cu resursă de tip binar, pot face pur și simplu ceva de genul acesta...

My.Resources.some_resource_file.ExtractResourceToDisk(newpath)

Rețineți că va trebui să adăugați funcția de mai jos la un modul, nu puteți crea metode de extensie în interiorul unei clase.

''' <summary>
''' Extracts the binary resource file and saves it to the specified location.
''' </summary>
''' <param name="Resource">[Byte()] The binary resource file byte array.</param>
''' <param name="FileToExtractTo">[String] The full file path of the new file to be saved.</param>
''' <returns>[Boolean] Returns True on success.</returns>
<Extension>
Public Function ExtractResourceToDisk(ByVal Resource As Byte(), ByVal FileToExtractTo As String) As Boolean
    Try
        Using ms As New MemoryStream(Resource)
            Using ResourceFile As New FileStream(FileToExtractTo, FileMode.Create)
                Dim b(ms.Length) As Byte
                ms.Read(b, 0, ms.Length)
                ResourceFile.Write(b, 0, b.Length - 1)
                ResourceFile.Flush()
                ResourceFile.Close()
            End Using
        End Using
        Return True
    Catch ex As Exception
        Return False
    End Try
End Function
person Fütemire    schedule 24.08.2016

Mai întâi, asigurați-vă că setați Build Action al setului de fișiere respectiv la Embedded resource.

Apoi, pe baza răspunsului @Greg Bogumil, rulați această metodă:

public static bool ExtractResourceToDisk(string ResourceName, string FileToExtractTo) {
  //Choose any one assembly that matches your needs.
  var asm = System.Reflection.Assembly.GetEntryAssembly();
  //var asm = System.Reflection.Assembly.GetExecutingAssembly();
  //var asm = System.Reflection.Assembly.GetCallingAssembly();
  var s = asm.GetManifestResourceStream(ResourceName);
  var resFile = new System.IO.FileStream(FileToExtractTo, System.IO.FileMode.Create);
  if (resFile == null) return false;
  s.CopyTo(resFile);
  return true;
}

Folosesc metoda CopyTo în schimb pentru că este mai concisă.

person Fandi Susanto    schedule 28.07.2017

Am făcut lucrul acesta cu copierea fișierelor într-un director de destinație din fișierul încorporat.

Dim FilePath As String = Application.StartupPath & "\testing.txt" 'file name and its extension
            Using MsiFile As New FileStream(FilePath , FileMode.Create)
                MsiFile.Write(My.Resources.testing, 0, My.Resources.testing.Length)
            End Using
            My.Computer.FileSystem.CopyFile(FilePath , "C:\destination", Microsoft.VisualBasic.FileIO.UIOption.AllDialogs, Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing)
            MsgBox("done copy")
person Jing Xian    schedule 17.10.2020