从文件路径转到使用资源

时间:2014-08-21 17:55:49

标签: c# visual-studio-2010 resources

我当前的项目使用此excel文档的直接文件路径来读取excel文件的信息。我需要让我的项目准备好发布,所以我不能让项目硬编码为字符串形式的文件路径。

我想在我的资源中嵌入Excel文件,我已经完成了,但是我知道如何从Resource获取文件路径,并将文件路径发送到读取Excel文件的类。该类必须提供文件路径,因此我正在考虑制作此Excel文件的副本,然后在Temp文件夹中引用该类的文件路径以读取Excel文件。

  FileName = @"D:\SomeFolder\ExcelFile.xlsx"; //This is the old code, hard coded

//I need code  that is going to make a copy of this file from the Resources and save it somewhere in a temp folder, but then give me
  the File path in the form of a string.

            string FileName; 
         // I need the file name to have the directory of this excel that is in the Resource folder



            //Call Class to Create XML File and store Data from BIN File Locally on Program

            ReadExcel_CreateXML = new ExcelRecorder(FileName);

2 个答案:

答案 0 :(得分:0)

我不确定这是否是最佳解决方案,但它会起作用:

1st获取资源中文件的byte []数组:

byte[] fileByteArray = global::YourProjectNameSpace.Properties.Resources.ExcelFileName

使用此功能将文件导出到临时位置: (我从这里开始:Write bytes to file

public bool ByteArrayToFile(string _FileName, byte[] _ByteArray)
        {
            try
            {
                // Open file for reading
                System.IO.FileStream _FileStream =
                   new System.IO.FileStream(_FileName, System.IO.FileMode.Create,
                                            System.IO.FileAccess.Write);
                // Writes a block of bytes to this stream using data from
                // a byte array.
                _FileStream.Write(_ByteArray, 0, _ByteArray.Length);

                // close file stream
                _FileStream.Close();

                return true;
            }
            catch (Exception _Exception)
            {
                // Error
                Console.WriteLine("Exception caught in process: {0}",
                                  _Exception.ToString());
            }

            // error occured, return false
            return false;
        }

最后访问像你一样的临时文件

使用:

只需在表单中创建一个按钮,然后将此代码放在按钮的点击事件

private void button1_Click(object sender, EventArgs e)
    {
        byte[] fileByteArray = global::YourProjectNameSpace.Properties.Resources.ExcelFileName;

        if (ByteArrayToFile(@"C:\Temp\file.xlsx", fileByteArray))
        {
            //File was saved properly
        }
        else
        {
            //There was an error saving the file
        }
    }

希望它有效

答案 1 :(得分:0)

要考虑的其他事项是您可能正在使用FileStream以及BinaryReaderStreamReader来阅读当前文件。如果是这种情况,则可以编写文件的使用者以接受任意Stream,然后您可以创建MemoryStream以传递给使用类:

// The resource will be a byte array, I'm just creating a
// byte array manually for example purposes.
var fileData = System.Text.Encoding.UTF8.GetBytes("Hello\nWorld!");

using (var memoryStream = new MemoryStream(fileData))
using (var streamReader = new StreamReader(memoryStream))
{
    // Do whatever you need with the file's contents
    Console.WriteLine(streamReader.ReadLine());
    Console.WriteLine(streamReader.ReadLine());
}

这种方法意味着您不会使用您需要清理的临时文件来混乱客户端计算机。如果您需要通过任何其他类型的Stream处理数据,这也意味着您的消费类将变得更加灵活。