如何从文件数组中获取并显示所有文件大小

How do I get and display all the file sizes from the file array

我是编程新手,目前正在尝试从文件数组中获取所有文件大小并显示在它们旁边。我找到了 FileInfo 解决方案,但不知道它是如何工作的,也无法在线找到任何解决方案。在我添加 FileInfo 行之前,文件数组检索并成功显示。

private void Button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog FBD = new FolderBrowserDialog();

    if (FBD.ShowDialog()==DialogResult.OK)
    {
        listBox1.Items.Clear();
        string[] files = Directory.GetFiles(FBD.SelectedPath);
        string[] dirs = Directory.GetDirectories(FBD.SelectedPath);


        foreach (string file in files)
        {
            long length = new FileInfo(FBD.SelectedPath).Length; //FileNotFoundException
            listBox1.Items.Add(Path.GetFileName(file + length));
        }

        foreach (string dir in dirs)
        {
            listBox1.Items.Add(Path.GetFileName(dir));
        }
    }  
}

我有一个可以打开文件夹对话框的按钮,用户可以 select 目录,还有一个列表框可以显示 selected 路径中的所有 file/directory。我真的可以获取沿路径的所有文件大小并显示在文件/目录旁边吗?

您几乎答对了,请尝试以下操作:

private void Button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog folderBrowser = new FolderBrowserDialog();

    if (folderBrowser.ShowDialog() == DialogResult.OK)
    {
        listBox1.Items.Clear();
        string[] files = Directory.GetFiles(folderBrowser.SelectedPath);

        foreach (string file in files)
        {
            var fileInfo = new FileInfo(file);
            listBox1.Items.Add($"{Path.GetFileName(file)} {fileInfo.Length} bytes.");
        }
    }  
}

不是 Directory.GetFiles 你不能 - 它是 returns 作为文件路径的字符串数组。你必须从每个 FileInfo 中创建一个新的 FileInfo 并获得它的长度.. 最好调用 DirectoryInfo 的方法,returns 你是一个 [=14] 的数组=] 开始于:

private void Button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog FBD = new FolderBrowserDialog();

    if (FBD.ShowDialog()==DialogResult.OK)
    {
        listBox1.Items.Clear();
        FileInfo[] files = new DirectoryInfo(FBD.SelectedPath).GetFiles();
        string[] dirs = Directory.GetDirectories(FBD.SelectedPath);


        foreach (FileInfo file in files)
        {
            listBox1.Items.Add(file.Name + "(" + file.Length + " bytes)");
        }

        foreach (string dir in dirs)
        {
            listBox1.Items.Add(Path.GetFileName(dir));
        }
    }  
}

我不太清楚你说的 "Can I actually get all the files sizes along the path and display next to the .. directory"

是什么意思

目录没有文件大小;你的意思是你想要目录中所有文件大小的总和吗?对于层次结构中的所有子目录还是仅对于顶级目录?也许是这样的:

private void Button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog FBD = new FolderBrowserDialog();

    if (FBD.ShowDialog()==DialogResult.OK)
    {
        listBox1.Items.Clear();
        FileInfo[] files = new DirectoryInfo(FBD.SelectedPath).GetFiles();
        DirectoryInfo[] dirs = new DirectoryInfo(FBD.SelectedPath).GetDirectories();


        foreach (FileInfo file in files)
        {
            listBox1.Items.Add(file.Name + "(" + file.Length + " bytes)");
        }

        foreach (DirectoryInfo dir in dirs)
        {
            listBox1.Items.Add(dir.Name + "(" + dir.GetFiles().Sum(f => f.Length) + " bytes)");
        }
    }  
}

要使 Sum 起作用,您必须导入 System.Linq


顺便说一句,我提出以下内容作为对您的代码为何不起作用的评论:

private void Button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog FBD = new FolderBrowserDialog();

    if (FBD.ShowDialog()==DialogResult.OK)
    {
        listBox1.Items.Clear();
        string[] files = Directory.GetFiles(FBD.SelectedPath);
        string[] dirs = Directory.GetDirectories(FBD.SelectedPath);


        foreach (string file in files) //ok, so file is the filepath
        {
            //it doesn't work because you put "FBD.SelectedPath" in instead of "file" 
            // FBD.SelectedPath is a directory, not a file, hence the FileNotFoundException
            //But the real problem is probably a cut n paste error here
            long length = new FileInfo(FBD.SelectedPath).Length; 


            //it would work out but it's a weird way to do it, adding the length on before you strip the filename out
            //Path doesnt do anything complex, it just drops all the text before the 
            //last occurrence of /, but doing Path.GetFilename(file) + length would be better
            listBox1.Items.Add(Path.GetFileName(file + length)); 
        }

        foreach (string dir in dirs)
        {
            //need to be careful here: "C:\temp\" is a path of a directory but calling GetFilename on it would return "", not temp
            listBox1.Items.Add(Path.GetFileName(dir));
        }
    }  
}