Как я могу соединить эти биты кода C #, чтобы программа работала правильно? - PullRequest
0 голосов
/ 22 июня 2011

У меня есть программа, в которой пользователь должен иметь возможность найти любую папку, и программа будет возвращать файлы / папки (подкаталоги) в пределах выбранного пути, а также дату и размер каждого файла / папки.

Я использовал folderBrowserDialog, чтобы разрешить поиск в системе, включая сети (почти все, что я искал, ТОЛЬКО возвращали C: \, но у нас есть нечто большее, чем просто. FolderBrowserDialog позволяет этому происходить.Раньше я думал, что нашел какой-то код, который помог бы мне дальше с тем, что я пытаюсь выполнить, но это оказалось тем, что мне не нужно, по крайней мере, это был опыт обучения, за исключением процесса рекурсии.

Я считаю, что у меня есть код для размера файлов и каталогов, а также даты и времени. Я нашел эти размер и дата .

ВВ тот момент, когда я создаю код, мне выдают два сообщения об ошибке

1. 'DD.Form1.GetFileSize(double)' not all code paths return a value. 

2. The name 'txtFile' does not exist in the current context 

и запускается только первая часть кода (с папкой BroweserDialog), текстовое поле не работает, и я хотел бы, чтобы пользовательввести путь и найти его и вызвать те же данные - имена и пути к папкам / файлам, включая подкаталоги, а также дату и размер файла.л.Что мне нужно сделать, чтобы это работало правильно?Спасибо

Вот мой код.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace DD
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private void browse_Click(object sender, EventArgs e)
        {
            //
            // This event handler was created by double-clicking the window in the designer.
            // It runs on the program's startup routine.
            //
            DialogResult result = folderBrowserDialog1.ShowDialog();
            if (result == DialogResult.OK)
            {
                //
                // The user selected a folder and pressed the OK button.
                // We print the number of files found.
                //
                string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);
                MessageBox.Show("Files found: " + files.Length.ToString(), "Message");
            }

            //Obtaining the sub directories in a folder
        }

        void DirSearch(string sDir)
        {
            try
            {
                foreach (string d in Directory.GetDirectories(sDir))
                {
                    foreach (string f in Directory.GetFiles(d, txtFile.Text))
                    {

                    }
                    DirSearch(d);
                }
            }
            catch (System.Exception excpt)
            {
                Console.WriteLine(excpt.Message);
            }
            {
                //Obtaining the date and time of a file
                // Write file containing the date with BIN extension
                //

                string n = string.Format("text-{0:yyyy-MM-dd_hh-mm-ss-tt}.bin",
        DateTime.Now);
                File.WriteAllText(n, "aaa");
            }
            //Obtaining the size of a file
        }
        private string GetFileSize(double byteCount)
        {
            string size = "0 Bytes";
            if (byteCount >= 1073741824.0)
                size = String.Format("{0:##.##}", byteCount / 1073741824.0) + " GB";
            else if (byteCount >= 1048576.0)
                //etc...     

                return size;

        }

    }
}

Ответы [ 3 ]

1 голос
/ 22 июня 2011

Хорошо, я быстро взглянул на статью, на которую вы ссылались, и вот некоторые комментарии, которые могут помочь.

Сначала давайте взглянем на

private string GetFileSize(double byteCount)         
{
             string size = "0 Bytes";
             if (byteCount >= 1073741824.0)
                 size = String.Format("{0:##.##}", byteCount / 1073741824.0) + " GB";
             else if (byteCount >= 1048576.0)
                 //etc...
             return size;
} 

Что это должно сделатьпохоже, что-то более похожее на это

private string GetFileSize(double byteCount)
{
        string size = "0 Bytes";
        if (byteCount > = 1073741824.0)
        {
           size = String.Format("{0:##.##}", byteCount / 1073741824.0) + " GB";
        }
        else if (byteCount >= 1048576.0)
        {
            //do something else in here
        }
        return size;
}

Вам не нужно использовать фигурные скобки в операторе if / else для разделения ваших блоков кода для выполнения, если это только одна строка, я включил здесьдля ясности.Компилятор C # будет ассоциировать следующую исполняемую строку кода после и если или еще с этим if или else, если только вы не используете {}, чтобы указать блок или завершить саму строку if или else с помощью ";"

Следующая проблема, с которой вы столкнулись, связана со ссылкой textFile.Text в цикле foreach.Скорее всего, это элемент управления Textbox на форме в примере.Параметр, который вы вводите, является фильтром для типа файлов, которые вы ищете.Таким образом, вы, скорее всего, не имеете текстовое поле в форме с именем textFile.

Редактировать: Нет команды одной строки для рекурсивного получения списка всех файлов в структуре каталогов, встроенной в .NETфреймворк.Таким образом, у вас есть метод ниже, чтобы сделать это для вас.То, как вы могли бы использовать это, чтобы получить единый список всех путей, было бы следующим:

List<FileInfo> DirSearch(string sDir)
     {
         List<FileInfo> filesList = new List<FileInfo>();
         try
         {
             foreach (string d in Directory.GetDirectories(sDir))
             {
                 foreach (string f in Directory.GetFiles(d, txtFile.Text))
                 {
                    fileList.Add(new FileInfo(f));
                  }
                 DirSearch(d);
             }
         }
         catch (System.Exception excpt)
         {
             Console.WriteLine(excpt.Message);
         }
         return fileList;
     } 

Теперь вы можете распечатать детали каждого из этих файлов примерно так:

foreach (FileInfo fi in new DirSearch("c:\"))
{
     console.Writeline(String.Format("Filename: {0}   Size:  {1}", fi.Name, fi.Length));
}
0 голосов
/ 22 июня 2011

Код в следующем блоке кода явно не возвращает значение для оператора TRUE и FALSE.

В этом контексте IF = TRUE else = FALSE, конечно, я предлагаю использовать {и} для операторов ALL IFпока у вас нет общего понимания этого факта.

    private string GetFileSize(double byteCount)     
    {           
  string size = "0 Bytes";            
 if (byteCount >= 1073741824.0)             
    size = String.Format("{0:##.##}", byteCount / 1073741824.0) + " GB";   
          else if (byteCount >= 1048576.0)   
              //etc...                       return size;   
       }  

Имя 'txtFile' не существует в текущем контексте

Вы никогда не объявляли переменную с именем txtFileтаким образом, вы не можете использовать его как переменную.Полагаю, вы пытаетесь использовать свойство Text элемента управления textbox.

0 голосов
/ 22 июня 2011

lstFilesFound не объявлен в методе, использующем его, и я не вижу его в вашем коде.txtFile не объявлен в методе, использующем его, и, как и другая переменная, я не вижу его в другой области видимости в вашем коде.GetFileSize должен включать else после else if.Это требуется из-за того, что вы использовали if / else if до этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...