重命名C#Windows窗体listBox上列出的文件

时间:2018-08-23 16:10:41

标签: c#

我是C#的新手。我正在使用Windows窗体,该窗体应该执行以下操作:

  1. 浏览本地驱动器上的文件
  2. 允许用户选择文件
  3. 在列表框中列出所选文件
  4. 允许用户输入新的文件名,当他们单击“重命名”按钮时,它将在ListBox中重命名选定的文件。

我无法执行第4步,因为listBox中的新文本已更改,但文件夹中的实际文件名仍然相同。我怎样才能做到这一点?我在Form.cs下方列出了

谢谢。

public partial class everSupportForm : Form
{
    private void buttonSelect_Click(object sender, EventArgs e)
    {
        System.IO.Stream myStream;
        var myDialog = new OpenFileDialog();

        myDialog.InitialDirectory = @"c:\";
        myDialog.Filter = "All files (*.*)|*.*|All files (*.*)|*.*";

        //  + "Images (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|" //If you want to add filters for browsing only images.
        myDialog.FilterIndex = 1;
        myDialog.RestoreDirectory = true;
        myDialog.Multiselect = true;
        myDialog.Title = "Please Select File(s) to Rename";

        if (myDialog.ShowDialog() != DialogResult.OK) return;
        {
            foreach (var file in myDialog.FileNames)
            {
                try
                {
                    if ((myStream = myDialog.OpenFile()) != null)
                    {
                        using (myStream)
                        {    
                            outputListBox.Items.Add(System.IO.Path.GetFileName(file));
                        }
                    }
                }

                catch (Exception ex)
                {
                    // Could not load File specifying the causes 
                    MessageBox.Show("Cannot display the File");
                }
            }
        }
    }

    private void buttonExit_Click(object sender, EventArgs e) => Application.Exit();

    // Removes a selected item
    private void buttonRemove_Click(object sender, EventArgs e)
    {
        if (outputListBox.SelectedIndex >= 0)
            outputListBox.Items.RemoveAt(outputListBox.SelectedIndex);
    }

    // Clears the listed images ListBox
    private void buttonClear_Click(object sender, EventArgs e) => outputListBox.Items.Clear();
    private void buttonRename_Click(object sender, EventArgs e)
    {
        if (outputListBox.SelectedIndex >= 0)
             outputListBox.Items[outputListBox.SelectedIndex] = newNametextBox.Text;
        else MessageBox.Show("There is no Files in the Above list to be Selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

1 个答案:

答案 0 :(得分:1)

首先,您在这里遇到问题。
您正在使用Path.GetFileName添加文件名,因此不再具有文件路径=>您无法重命名它们。

解决方案1-将路径添加到列表框

您只需删除Path.GetFileName,然后在单击重命名按钮时使用InputBox向用户询问新文件名:
NB:添加对Microsoft.VisualBasic的引用,InputBoxMicrosoft.VisualBasic.Interaction命名空间中。

private void buttonRename_Click(object sender, EventArgs e)
{
    if (outputListBox.SelectedIndex >=0)
    {
        string fileToRename = outputListBox.Items[outputListBox.SelectedIndex].ToString();
        string newFileName = InputBox("Please enter the new file's name:", "Rename file", "Default value");
        if (!string.IsNullOrEmpty(newFileName))
        {
            string fileName = Path.GetFileName(fileToRename);
            string newFilePath = fileToRename.Replace(fileName, newFileName);
            System.IO.File.Move(fileToRename, newFilePath);
            outputListBox.Items[outputListBox.SelectedIndex] = newFilePath;
        }
    }
    else
    {
        MessageBox.Show("There is no Files in the Above list to be Selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

解决方案2-保留包含路径的单独列表

此概念与第一个解决方案相同,但是您没有添加文件路径到列表框,而是添加了文件名,但是保留了与列表框同步的单独路径列表。
这意味着,如果您修改列表框,请修改路径列表。

之后,您可以使用列表框的SelectedIndex访问文件路径(因为它们已同步)。