Vy Do
Vy Do

Reputation: 52716

WinForms how to open file in resources folder

I am new in WinForms technology. I am using .NET Framework 4.8 , Microsoft Visual Studio 2019. I put file in Resources folder.

enter image description here enter image description here

I tried something like this

using DevExpress.XtraBars;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace accwf
{
    public partial class NhapSoDu : DevExpress.XtraBars.Ribbon.RibbonForm
    {
        public NhapSoDu()
        {
            InitializeComponent();
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
            Process.Start(".../B01-DN_01_Summary.xlsx");
        }
    }
}

please guide me finish it.

Upvotes: 0

Views: 2418

Answers (2)

Jaskier
Jaskier

Reputation: 1095

You are currently only outputting the base directory. Along with that, you're only looking for files within that base directory. Execution happens from the base directory, so your program is looking for ..\Path\to\exe\B01-DN_01_Summary.xlsx when it should be looking for ..\Path\to\exe\Resources\FilesHere\ImportExcel\B01-DN_01_Summary.xlsx

To note: embedding resources files into your application is not recommend. It's preferable to instead store their locations and allow the application to traverse your directories to find the specified file locations.

Here's an adapted version you can try:

You will need to make sure that the Copy to Output Directory property for you desire file is set to "Copy Always" or "Copy if Newer". This will ensure the directory path is created in your output directory.

namespace accwf
{
    public partial class NhapSoDu : DevExpress.XtraBars.Ribbon.RibbonForm
    {
        public NhapSoDu()
        {
            InitializeComponent();
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            string resourcePath = System.IO.File.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Resources\\FilesHere\\ImportExcel\\B01-DN_01_Summary.xlsx")
            
            if (File.Exists(resourcePath))
            {
                MessageBox.Show("Exists");
            }
            else 
            {
                MessageBox.Show("Doesn't Exist");
            }
            
            Process.Start(resourcePath);
        }
    }
}

This is an example of how I get PDF file documentation for a help menu I have:

public void MyMethod()
        {
            // helpMenuPath is a global var set to something like: Area/MyApp/Resources/
            string filePath = helpMenuPath;
            string[] fileNames = new string[0]; // Initialize the variable with length of 0. Directory.GetFiles() will allow for this length to be overwritten 

            // Try/Catch in case bad dir
            try
            {
                fileNames = Directory.GetFiles(filePath);
            }
            catch (IOException ioe)
            {
                // error catch for if bad dir
                MessageBox.Show($"Error in getting files: {ioe.Message}");
            }

            // Do something with files ...
        }

Upvotes: 0

LordPupazz
LordPupazz

Reputation: 669

I do this in one of my applications to open a XLSX file that is an embedded resource in my application

private void buttonOpenTemplate_Click(object sender, EventArgs e)
{
    byte[] templateFile = Properties.Resources._01__So_du_tai_khoan; // This is your Excel document in the application Resources
    string tempPath = $"{Path.GetTempFileName()}.xlsx";
    using (MemoryStream ms = new MemoryStream(templateFile))
    {
        using(FileStream fs = new FileStream(tempPath, FileMode.OpenOrCreate))
        {
            ms.WriteTo(fs);
            fs.Close();
        }
        ms.Close();
    }
    Process.Start(tempPath);
}

This requires a reference to System.IO for access to the MemoryStream and FileStream classes.

Upvotes: 2

Related Questions