如何以编程方式复制包含的文件

Posted

技术标签:

【中文标题】如何以编程方式复制包含的文件【英文标题】:How to copy included file programmatically 【发布时间】:2012-09-01 00:51:58 【问题描述】:

我有一个 Visual C# 2008 项目。在我的项目浏览器中,我有一个 SQL CE 数据库(sdf 文件),因此我可以在设计器中使用数据库和数据集。在运行时,sdf 文件被复制到输出目录。当用户保存自己的数据库时,此 sdf 文件将复制到用户选择的任何文件名,并将其数据集保存到副本中。目前没问题。

如果可能的话,我想以不同的方式来做这件事。我不想在程序首次运行时复制 sdf 文件,而是对其进行设置,以便当用户保存他们的数据库时,然后它使用他们选择的名称复制出 sdf 文件并将他们的数据集保存到其中.

我已经阅读了将文件写为二进制文件的方法,这确实有效,但它需要几行似乎不必要的代码。有没有办法只是告诉程序“嘿,继续快速复制这个 sdf 文件”?毕竟,程序可以在您第一次运行时自动执行。

【问题讨论】:

您希望此脚本使用哪种语言以及您尝试过什么? (Visual) C#,正如我所说。对不起,如果我不够清楚。现在,该文件设置为仅设置为“始终复制”。我尝试了一种将文件写入二进制流的方法,正如我现在似乎无法找到的***上的某处所建议的那样,但正如我所说,它似乎需要太多代码,我认为必须有一个导出文件的简单命令,因为程序可以在您首次运行时执行此操作。我知道我可以在设计时保存文件并将其作为资源包含以方便导出,但在解决方案中两次添加文件似乎是多余的。 【参考方案1】:

将数据库文件添加为项目中的资源。然后,当您希望文件出现时,只需将字节数组写入文件即可。

例子:

File.WriteAllBytes("destination path", Properties.Resources.YourResourceName);

【讨论】:

我知道我可以将它添加为资源并简单地“写入所有字节”,我并不完全反对这个想法。考虑到文件已经在项目中,在我的解决方案资源管理器中,这似乎有点多余。而且由于我可以选择“如果较新则复制”或“始终复制”(意味着程序可以从那里导出文件),因此将有一个简单的单行代码,就像您刚刚发布的那样。如果我错了,你的方法可能是我最好的选择。 我指出的方法意味着数据库将位于 .exe 本身内。您上面提到的选项在哪里意味着您需要将 .exe 与额外的文件(数据库文件)一起发送。或者,可以使用某些类以编程方式创建数据库,具体取决于您使用的数据库类型。在不知道您当前使用的数据库的情况下很难为您提供更多信息。但请记住,这将涉及以编程方式重新创建每列的表/列/属性等。 刚刚注意到您的问题提到了您正在使用的数据库。看看***.com/questions/6196274/… & ***.com/questions/1487845/… 编辑:对不起,我看到你回复了。暂时忽略这个。 我阅读了您的链接。我不需要以编程方式创建数据库。它已经在设计器中创建,带有一个表模式。我只需要在需要时导出它,您的“writeallbytes”方法似乎可以使用。我可以只使用“嵌入式资源”构建操作,还是需要将文件单独物理添加到我的资源中(这是我试图避免的)?【参考方案2】:

我喜欢与堆栈用户分享我的知识 你可以分析这段代码找到可以帮助的东西

使用系统;

使用 System.Collections.Generic;

使用 System.ComponentModel;

使用 System.Data;

使用 System.Drawing;

使用 System.Linq;

使用 System.Text;

使用 System.Windows.Forms;

使用 System.Data.SqlServerCe;

使用 System.IO;

namespace localdatabaseconnect

public partial class Form1 : Form


    public Form1()
    
        InitializeComponent();
    
    string conString = Properties.Settings.Default.locallyConnectionString;
    private void button1_Click(object sender, EventArgs e)
    


        // Open the connection using the connection string.
        using (SqlCeConnection con = new SqlCeConnection(conString))
        
            con.Open();

            // Insert into the SqlCe table. ExecuteNonQuery is best for inserts.
            int id = int.Parse(textBox1.Text);
            string nom = textBox2.Text;
            string prenom = textBox3.Text;
            using (SqlCeCommand com = new SqlCeCommand("INSERT INTO testme (id,nom,prenom) VALUES(@id,@nom,@prenom)", con))
            
                com.Parameters.AddWithValue("@id", id);
                com.Parameters.AddWithValue("@nom", nom);
                com.Parameters.AddWithValue("@prenom", prenom);
                com.ExecuteNonQuery();
            
            con.Close();
        
    

    private void button2_Click(object sender, EventArgs e)
    
        using (SqlCeConnection con = new SqlCeConnection(conString))
        
            con.Open();
            // Read in all values in the table.
            using (SqlCeCommand com = new SqlCeCommand("SELECT * FROM testme", con))
            
                SqlCeDataReader reader = com.ExecuteReader();
                while (reader.Read())
                
                    string num = reader[0].ToString();
                    MessageBox.Show("hi"+num);
                
            
            con.Close();
        
    

    private void button3_Click(object sender, EventArgs e)
    

        string path = "c:\\ChekatyResources";
     try

      if (!Directory.Exists(path))
        

      // Try to create the directory.
          DirectoryInfo di = Directory.CreateDirectory(path);
         MessageBox.Show("file is created");
         
       else 

          MessageBox.Show("file is exist");

          
          
            catch (IOException ioex)
           
  MessageBox.Show(ioex.Message);
           

       

    private void Form1_Load(object sender, EventArgs e)
    
        //string executable = System.Reflection.Assembly.GetExecutingAssembly().Location;

        //string path = (System.IO.Path.GetDirectoryName(executable));
        //MessageBox.Show(path);
        //File.WriteAllBytes("destination path",);
        string paths = "c:\\";
        AppDomain.CurrentDomain.SetData("DataDirectory", paths);

        string connStr = @"Data Source =c:\ChekatyResources\locally.sdf;";

        if (!File.Exists(@"c:\ChekatyResources\locally.sdf"))
        

            SqlCeEngine engine = new SqlCeEngine(connStr);
            engine.CreateDatabase();

            SqlCeConnection conn = null;


            try
            
                conn = new SqlCeConnection(connStr);
                conn.Open();

                SqlCeCommand cmd = conn.CreateCommand();
                cmd.CommandText = "CREATE TABLE testme(id int, prenom ntext,nom ntext)";
                cmd.ExecuteNonQuery();
            
            catch
            

            
            finally
            
                conn.Close();
            
        
        else  MessageBox.Show("it's exist"); 
    

【讨论】:

以上是关于如何以编程方式复制包含的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取 FCM 发送、打开和转换的报告? [复制]

以编程方式确定 Excel 文件 (.xls) 是不是包含宏

以编程方式访问 iOS 上的应用程序图标

使用 Hadoop 以编程方式解压缩包含多个不相关 csv 文件的文件

如何在 Objective-C 中以编程方式检查协议是不是包含某些方法?

用于以编程方式创建的用户控件的C#Winform Click事件[复制]