.NET将嵌入式文件资源的副本复制到本地驱动器

时间:2010-04-08 19:19:05

标签: .net wpf vb.net ms-access file-io

我是使用.NET中的文件的新手

我正在使用3.5 Framework在VB.NET中创建一个WPF应用程序。 (如果你在C#中提供一个例子,那就完全没问了。)

在我的项目中,我有一个MS Access数据库的模板。我希望的行为是,当用户单击File - > New时,他们可以创建此模板的新副本,为其指定文件名,并将其保存到本地目录。

数据库已经有了表和一些与我的应用程序接口所需的起始数据(一个用户友好的数据编辑器)

我认为这种方法是将此“template.accdb”文件作为项目中的资源包含在内,并在运行时以某种方式将其写入文件?

非常非常感谢任何指导。

谢谢!

7 个答案:

答案 0 :(得分:5)

确保将完全限定的命名空间名称传递给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

答案 1 :(得分:2)

“最简单”的事情就是将它作为输出文件包含在程序安装中,以便在应用程序安装时将其安装到某个地方(可能在应用程序的目录或其子目录中)。然后,当您需要创建一个新模板时,可以简单地使用File.Copy。我并不是说这是最好的解决方案,只是最少量的工作。您可以阅读File.Copy方法here

答案 2 :(得分:2)

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);
        }
    }   
}

应该做的伎俩。范围将是资源名称的命名空间范围,允许您缩短资源名称,这是完全限定的。

答案 3 :(得分:1)

我以前回答过:

New Access database, how can it be done?

有趣的是,这是一个从原版VB中被攻击的版本,但是我没有VB(长篇故事)。

我会更进一步,并建议你也想在代码中创建你的模式 - 即只是转储一个空数据库,然后使用DDL在其中创建模式。

这个C#和SQL Server版本 - 我再也没有访问/ vb.net版本

How to create "embedded" SQL 2008 database file if it doesn't exist?

答案 4 :(得分:0)

我修改了Greg Bogumil从上面回答来创建一个扩展方法。 现在在任何二进制类型资源文件上,我可以简单地做这样的事情......

My.Resources.some_resource_file.ExtractResourceToDisk(newpath)

请注意,您必须将以下函数添加到模块中,不能在类中创建扩展方法。

''' <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

答案 5 :(得分:0)

首先,请务必将相应文件的HasRequired(x => x.Property) .WithMany() //no need to specify the navigation property on the other side .HasForeignKey(x=> x.ForeignKeyProperty); 设置为Build Action

然后基于@Greg Bogumil回答,你运行这个方法:

Embedded resource

我使用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; } 方法,因为它更简洁。

答案 6 :(得分:0)

我已经完成了将文件从嵌入式文件复制到目标目录的工作。

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")