如何在不加载文件扩展名的情况下将文件名作为列表框项加载到列表框中?

时间:2016-07-07 13:19:09

标签: c# listbox openfiledialog

我加载的插件必须加载到左侧的列表框中,并且必须加载它们而不使用文件扩展名。

所以

  

“FirstPlugin.dll”

将加载为

  

“FirstPlugin”

When I load the file name without extension in the code I tried, either it loads just the name and does not execute or it just loads the file name with the extension.

这是背后的代码:

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using PluginContracts;
using System;
using System.IO;
using Microsoft.Win32;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System.Diagnostics;
using System.Linq;

namespace SimplePlugin
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>

    public partial class MainWindow : Window
    {

        Dictionary<string, IPlugin> _Plugins; // move to class scope


        public MainWindow()
        {
            InitializeComponent();
            _Plugins = new Dictionary<string, IPlugin>();

        }

        private void AssembleComponents(object sender)
        {


            string selection = "";
            if (sender is ListBox)
            {
                if (((ListBox)sender).SelectedValue != null)
                    selection = ((ListBox)sender).SelectedValue.ToString();
            }

            string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
            DirectoryCatalog cat = new DirectoryCatalog(path);

            //ICollection<IPlugin> plugins = PluginLoader.LoadPlugins("Plugins");
            ICollection<IPlugin> plugins = GenericPluginLoader<IPlugin>.LoadPlugins("Plugins");



            foreach (var item in plugins)
            {
                //add only if not already present
                if (!_Plugins.ContainsKey(item.Name))
                {
                    string dllName = GetDLLName(item.Name);

                    Button b = new Button() 
                    { 
                        Name = dllName.Replace(".", "").ToUpper(), 
                        Content = item.Name,
                        Visibility = System.Windows.Visibility.Hidden 
                    };

                    b.Click += b_Click;
                    PluginGrid.Children.Add(b);

                    _Plugins.Add(item.Name, item);



                   // this.PluginGrid.Children.Clear();  
                   //by Vasey

                }
            }


            // make visible the selected plugin button
   foreach (var ctl in PluginGrid.Children)
   {
       if (ctl is Button)
       {
           Button button = (Button)ctl;

           if (button.Name.Equals(selection.Replace(".", "").ToUpper()))
           {

               button.Visibility = System.Windows.Visibility.Visible;
           }
           else
           {
                button.Visibility = System.Windows.Visibility.Hidden;
           }
       }
   }
        }


        private void b_Click(object sender, RoutedEventArgs e)
        {
            Button b = sender as Button;
            if (b != null)
            {
                string key = b.Content.ToString();
                if (_Plugins.ContainsKey(key))
                {
                    IPlugin plugin = _Plugins[key];
                    plugin.Do();
                }
            }


        }




        private void addPlugin_Click(object sender, RoutedEventArgs e)
        {
            //Calls OpenFile Method 
            OpenFile();

        }

        private void OpenFile()
        {
            _Plugins = new Dictionary<string, IPlugin>();
            ICollection<IPlugin> listbox = GenericPluginLoader<IPlugin>.LoadPlugins("Plugins");

            var fileDialog = new OpenFileDialog();

            fileDialog.Multiselect = true;
            fileDialog.Filter = "All files (*.*)|*.*|DLL files (*.dll)|*.dll|CS Files (*.cs)|*.cs";

            if (fileDialog.ShowDialog() == true)
            {
                string filename = fileDialog.FileName;
                var ext = System.IO.Path.GetFileNameWithoutExtension(filename);

                // ListBox lbFiles = new ListBox();

                //this.Controls.Add(lbFiles);
                //lbFiles.Size = new System.Drawing.Size(200, 100);
                //lbFiles.Location = new System.Drawing.Point(10, 10);

              lbFiles.Items.Add(System.IO.Path.GetFileName(filename));


               //foreach (var item in listbox)
               //{
               //    //add only if not already present
               //    if (!_Plugins.ContainsKey(item.Name))
               //    {
               //        string dllName = GetDLLName(item.Name);

               //        ListBox lbName= new ListBox()
               //        {
               //            Name = dllName.Replace(".", "").ToUpper(),

               //        };

               //      //lbFiles.Items.Add(item.Name);
               //        PluginGrid.Children.Add(lbName);

               //        _Plugins.Add(item.Name, item);



               //        // this.PluginGrid.Children.Clear();  
               //        //by Vasey

               //    }
               //}

                //Calls CopyToDir method and copies dll's to Plugin Folder
                CopyToDir(filename);
            }

        }

        private void CopyToDir(string filename)
        {

            string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
            Console.WriteLine(path);

            //Check the directory exists
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            try
            {
                FileInfo fi = new FileInfo(filename);
                if (!File.Exists(System.IO.Path.Combine(path, fi.Name)))
                {
                    File.Copy(fi.FullName, System.IO.Path.Combine(path, fi.Name));
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }


        }

        // Get linkage between ListBox's DLL name list and the loaded plugin names
        string GetDLLName(string name)
        {
            string ret = "";

            name = name.Replace(" ", ""); // strip spaces

            Assembly asm = AppDomain.CurrentDomain.GetAssemblies().
                   SingleOrDefault(assembly => assembly.GetName().Name == name);

            if (asm != null)
            {
                ret = Path.GetFileNameWithoutExtension(asm.Location);
            }

            return ret;
        }


        private void lbFiles_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            AssembleComponents(sender);

        }

        private void ClearBtn_Click(object sender, RoutedEventArgs e)
        {
            try 
            {
              // Clears the ListBox
            lbFiles.Items.Clear();

            //Clears the Assembly
            this.PluginGrid.Children.Clear();

            //Loads next Assembly 
            _Plugins = new Dictionary<string, IPlugin>();

            } 
            catch
            {
                System.Windows.MessageBox.Show("No Items to Clear");
            }


        }

        private void RemoveSelectedItem_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                lbFiles.Items.RemoveAt(lbFiles.SelectedIndex);
            }
            catch 
            {
                System.Windows.MessageBox.Show("No Items to Remove");
            }
        }


    }
}

如何将文件名放入列表框并在没有扩展名的情况下工作?

1 个答案:

答案 0 :(得分:5)

您应该使用Path.GetFileNameWithoutExtension()方法,例如

result = Path.GetFileNameWithoutExtension(fileName);

看起来你已经收到了它,但在列表框中添加了错误

   lbFiles.Items.Add(System.IO.Path.GetFileName(filename));

更改

var ext = System.IO.Path.GetFileNameWithoutExtension(filename);
lbFiles.Items.Add(ext);