Member 12558924 Ответов: 1

Как проверить и получить zip-файлы между диапазонами дат из папки и записать их в combobox с помощью C# winforms


- Привет!!!
мне нужна помощь в C# winforms. Во-первых, я хочу использовать Datetimepicker, чтобы установить диапазон дат, в котором я мог бы еженедельно проверять, есть ли новый zip-файл в папке. если это так, то я хочу получить этот новый zipfile (только имя файла) в моем combobox. И после того, как я предполагаю получить все записи zip-файла в datagridview.
Как я могу это сделать? может ли кто-нибудь помочь мне с какими-нибудь идеями?

Большое спасибо!!!

Что я уже пробовал:

// Show the OpenFileDialog.
        DialogResult result = ofd.ShowDialog();
        if (result == DialogResult.OK)
        {
            string fullPath = ofd.FileName;
            string directory;
            directory = fullPath.Substring(0, fullPath.LastIndexOf('\\'));

            textBox1.Text = directory;

            DateTime.Now.ToString("yyyyMMdd"); // ??? i don't know how i can query the date range so that it will be considered in my code

            if (File.Exists(fullPath))
            {
                string[] AllZipFiles = Directory.GetFiles(directory,"*.zip",SearchOption.AllDirectories); // Get all files from the folder

                foreach (string zipfile in AllZipFiles)
                {
                    this.comboBox1.Items.Add(zipfile); // it' working but with all the fullpath, but i only want to get the filename like test.zip
                }

            }
            else
                MessageBox.Show("There is not Zip File in this Folder");
        }

1 Ответов

Рейтинг:
12

Maciej Los

Попробовать это:

string path = @"D:\Audiobooks"; //change initial path to your needs
string filter = "*.zip";
DateTime startdate = new DateTime(2012,1,1); //change dates to your needs
DateTime enddate = new DateTime(2016,12,31);

List<string> files = Directory.EnumerateFiles(path, filter, SearchOption.AllDirectories)
	.Where(x=>File.GetLastWriteTime(x)>=startdate && File.GetLastWriteTime(x)<=enddate)
	.Select(x=>Path.GetFileName(x))
	.ToList();

foreach(string zipfile in files)
{
    combobox1.Items.Add(zipfile);
}


Для получения более подробной информации, пожалуйста, смотрите:
Каталог.Метод EnumerateFiles (String, String, SearchOption) (System.IO)[^]
Файл.Метод GetLastWriteTime (String) (System.IO)[^]
Метод Path. GetFileName (Строка) (System.IO)[^]


Garth J Lancaster

сладкий (похожий на "узор", который я использую для таких случаев) +5

Maciej Los

- Спасибо, Гарт.
Овации
Мацей

Member 12558924

Эй,
Большое спасибо!!! Он работает для zip-файла, но можно ли оставить пользователю возможность вводить свой собственный диапазон дат всякий раз, когда он в этом нуждается, используя элемент управления DateTimePicker в моих формах(интерфейс)? Кроме того, я также хочу иметь возможность ввести точное время выбранной даты. То, что я пробовал, не работает.
Есть идеи? Заранее спасибо.

Maciej Los

Да, вы можете это сделать. Все, что вам нужно, чтобы это установить startdate и enddate, например:
DateTime startdate = DateTimePicker1.Value;

Пожалуйста, примите ответ как решение (зеленая кнопка).

Member 12558924

Дело сделано! должен ли я сделать это в коде позади элемента управления DateTimePicker или в элементе управления Button, где я пишу весь этот код? Я сделал это в коде позади элемента управления DateTimePicker, но я не уверен. Большое спасибо.

Maciej Los

Вставьте этот код в подпрограмму Button_Click.

Member 12558924

Большое вам спасибо, он работает очень хорошо !!! И как я могу заполнить новую combobox2 с записями каждого zip-файл? Я имею в виду, что я выбираю zip-файл в своем combobox1, его записи, такие как test.txt появится в combobox2 и записи этого test.txt также будет отображаться в datagridview в виде таблицы. Как я могу сделать это в том же коде?
я пробовал это сделать, чтобы заполнить новый combobox2, но это не работает. Я получаю ошибку и должен сломать код, когда он запускается. что касается datagridview, то я понятия не имею.
ZipArchive zip = ZipFile.OpenRead(каталог);
foreach (запись ZipArchiveEntry в zip.Записи)
{
comboBox2.предметы.Добавить (запись.Полное имя);
}
Было бы очень приятно помочь мне в последний раз.
еще раз спасибо всем

Maciej Los

Вы должны указать полное имя файла zip-файла.

Member 12558924

Это работает, но только для первого выбранного имени файла! Поэтому, когда я выбираю другой zip-файл в своем combobox1, мой код не заполняет combobox2 элементами вновь выбранного файла. Это всегда одни и те же данные в combobox2. Как мне изменить свой код, чтобы он работал? Спасибо

Maciej Los

Вы закрыли zip-файл перед дальнейшей обработкой?

Member 12558924

Доброе утро, Мацей, и спасибо тебе за помощь. Я не могу закрыть zip-файл, однако пытался закрыть zipfile или zip. Я получаю ошибку типа: "string или ZipArchive не содержит определения для 'close' и не может быть найден метод расширения 'close', принимающий первый аргумент типа string или ZipArchive." Это весь код в методе, возможно, вы сможете найти, почему он не работает. Еще раз спасибо!!!

мой код:
частная button1_Click_1 недействительным(объект отправителя, EventArgs в электронной)
{
// Создайте экземпляр класса FolderBrowserDialog
Диалоговое окно openfiledialog ОФД = новое диалоговое окно openfiledialog();

// Установить начальное свойство SelectedPath
ОФД.InitialDirectory = @ " \\имя_сервера";
фильтр = "*.молния";

// Показать OpenFileDialog.
DialogResult result = ofd.Метод showdialog();
if (result = = DialogResult.ОК)
{
строки полный путь = ОФД.имя файла;
строку каталога;
directory = fullPath. Substring(0, fullPath.LastIndexOf('\\'));

// Запишите выбранный путь в текстовое поле рядом с кнопкой
textBox1. Text = каталог;

если (файл.Существует(fullPath))
{
List & lt;string & gt; files = каталог.EnumerateFiles(каталог, фильтр, SearchOption.AllDirectories)
. Где (x = & gt; файл.GetLastWriteTime (x) >= startDate && файл.GetLastWriteTime (x) <= endDate)
.Выберите(х => По пути.GetFileName(х))
.Список();

поле combobox1.Предметы.Четкий();
по каждому элементу (строка zip-файл в архиве)
{
это. comboBox1.Предметы.Добавить (zipfile); / / заполнить cbx1 файлами*. zip
// zip-файл.Close (); потому что не работает
}

comboBox2.предметы.Четкий();
ZipArchive zip = ZipFile.OpenRead(fullPath);
foreach (запись ZipArchiveEntry в zip.Записи)
{
comboBox2.предметы.Добавить (запись.FullName); / / заполнить cbx2 файлами*. csv
// застежка-молния.Close (); также не работает
}
}
}
}

Maciej Los

- Привет!
Простой способ открыть zip-файл и перечислить его содержимое-это:

using (System.IO.Compression.ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(fullPath))
{
    foreach (System.IO.Compression.ZipArchiveEntry entry in archive.Entries)
    {
		Console.WriteLine("{0}", entry.FullName);
	}
        archive.Dispose();
} 

Для получения более подробной информации, пожалуйста, смотрите: Одному Классу

Member 12558924

Привет,
как я могу проверить содержимое zip-файла перед его чтением? я попробовал с файлом.Существует (fullpath), но проверка не выполняется. fullpath содержит каталог и имя файла zip. спасибо за ваше время

Maciej Los

Ты не можешь. Вы должны открыть его, чтобы иметь возможность прочитать его содержание. Так же, как ты делаешь это в реальности. ;)

Member 12558924

Я хотел запрограммировать сообщение, которое сообщит мне, есть ли один или несколько файлов cvs в zip-файле, и даст мне количество файлов, содержащихся в этом zip-файле. Разве это невозможно? я попробовал это:
ВАР = элемент combobox1.Элемент.Метод toString();
полный путь = ФБД.SelectedPath + "\ \ " + var;

comboBox2.предметы.Четкий();
если (файл.Существует(fullpath))
{
ZipArchive zip = ZipFile.OpenRead(fullpath);
Ящик для сообщений.Показать (Каталог.EnumerateFileSystemEntries(fullpath, "*. csv").ToList & lt;string> (). Count + "CSV файл(ы) присутствует"); / / получить ошибку здесь
foreach (запись ZipArchiveEntry в zip.Записи)
{
comboBox2.предметы.Добавить (запись.FullName); / / заполните comboBox2 файлами*. csv из выбранного zip-файла
}
застежка-молния.Располагать();
}
ещё
{
Ящик для сообщений.Показать("файл не CSV-файл(ы) присутствует");
}

Maciej Los

Хорошо, но вы должны задать еще один вопрос.

Member 12558924

ладно, дело сделано. Спасибо