private async void StartSearch(object sender, EventArgs e) { if (System.IO.Directory.Exists(pathTextBox.Text) || allDrivesCheckBox.Checked) { //формирование критериев поиска Date date = null; ISO iso = null; ExposureProgram ep = ExposureProgram.Any; Orientation or = Orientation.Any; ExposureTime et = null; bool isDSC = false; string camName = null; bool isManualWhiteBalance = false; bool isFlashOn = false; bool isGPS = false; bool isEdit = false; //--------------------------------- searchSettings.Clear(); //------ДАТА if (datesCheckBox.Checked == true) { if (endDateTimePicker.Value.Date < startDateTimePicker.Value.Date) { MessageBox.Show("Неверно выставлены настройки поиска по дате. Пожалуйста исправьте."); return; } searchSettings.AppendLine("Поиск по датам: " + startDateTimePicker.Value.ToShortDateString() + " - " + endDateTimePicker.Value.ToShortDateString()); date = new Date(startDateTimePicker.Value.Date, endDateTimePicker.Value.Date); } //-----ISO if (ISOCheckBox.Checked) { uint minISO; uint maxISO; bool isMinISOCorrect = uint.TryParse(minISOTextBox.Text, out minISO); bool isMaxISOCorrect = uint.TryParse(maxISOTextBox.Text, out maxISO); if (isMinISOCorrect == true && isMaxISOCorrect == true) { if (maxISO < minISO) { MessageBox.Show("Неверно выставлены настройки поиска по ISO. Пожалуйста исправьте."); return; } if (maxISO > uint.MaxValue) { MessageBox.Show("Неверно выставлены настройки поиска по ISO. Пожалуйста исправьте."); return; } searchSettings.AppendLine("Поиск по ISO: " + minISO + " - " + maxISO); iso = new ISO(minISO, maxISO); } else { MessageBox.Show("Неверно выставлены настройки поиска по ISO. Пожалуйста исправьте."); return; } } //-----ВЫДЕРЖКА if (ExposureTimeCheckBox.Checked) { Rational minExposureTime; Rational maxExposureTime; bool isMinValueCorrect = GetRationalFromString(minExposureTimeTextBox.Text, out minExposureTime); bool isMaxValueCorrect = GetRationalFromString(maxExposureTimeTextBox.Text, out maxExposureTime); if (isMinValueCorrect == true && isMaxValueCorrect == true) { //теперь проверим на нижние и верхние границы double min = minExposureTime.ToDouble(); double max = maxExposureTime.ToDouble(); if (!(min <= max + double.Epsilon)) { MessageBox.Show("Неверно выставлены настройки поиска по выдержке. Пожалуйста исправьте."); return; } searchSettings.AppendLine("Поиск по выдержке: " + minExposureTime.ToSimpleString() + " - " + maxExposureTime.ToSimpleString()); et = new ExposureTime(minExposureTime, maxExposureTime); } else { MessageBox.Show("Неверно выставлены настройки поиска по выдержке. Пожалуйста исправьте."); return; } } //---МОДЕЛЬ КАМЕРЫ if (cameraCheckBox.Checked) { if (!string.IsNullOrWhiteSpace(CameraTextBox.Text)) { camName = CameraTextBox.Text.Trim().Split(' ')[0]; searchSettings.AppendLine("Поиск по модели камеры: " + camName); } else { MessageBox.Show("Неверно выставлены настройки поиска по производителю камеры. Пожалуйста исправьте."); return; } } if (WhiteBalanceСheckBox.Checked) { isManualWhiteBalance = true; searchSettings.AppendLine("Поиск снимков с ручным балансом белого"); } if (flashOnCheckBox.Checked) { isFlashOn = true; searchSettings.AppendLine("Поиск снимков со вспышкой"); } if (gpsCheckBox.Checked) { isGPS = true; searchSettings.AppendLine("Поиск снимков с геоданными"); } if (EditCheckBox.Checked) { isEdit = true; searchSettings.AppendLine("Поиск редактированных снимков"); } if (ExposureProgramCheckBox.Checked) { if (exposureProgramComboBox.SelectedIndex == -1) { MessageBox.Show("Неверно выставлены настройки поиска по программе управления экспозицией. Пожалуйста исправьте."); return; } ep = (ExposureProgram)exposureProgramComboBox.SelectedIndex + 1; } //источник изображения if (DSCCheckBox.Checked) { isDSC = true; searchSettings.AppendLine("Поиск изображений сделанных только на фотоаппарат"); } if (orientationСheckBox.Checked) { int sel = orientationComboBox.SelectedIndex; if (sel == -1) { MessageBox.Show("Неверно выставлены настройки поиска по ориентации. Пожалуйста исправьте."); return; } switch (sel) { case 0: or = Orientation.Horizonatal; break; case 1: or = Orientation.Vertical; break; } } if (allDrivesCheckBox.Checked) { searchSettings.AppendLine("Поиск изображений: весь компьютер"); finder = new Search(!skipWinDirectoryCheckBox.Checked); } else { searchSettings.AppendLine("Поиск изображений в: " + pathTextBox.Text); finder = new Search(pathTextBox.Text, !skipWinDirectoryCheckBox.Checked); } finder.ChangeFolder += ChangeStatus; finder.NewFile += newFileFinded; status.Text = "Выполняется поиск..."; //---кнопка меняется на "стоп" startButton.Text = "Остановить поиск"; startButton.Click -= StartSearch; startButton.Click += Stop; searchToolStripMenuItem.Text = "Остановить поиск"; searchToolStripMenuItem.Click -= StartSearch; searchToolStripMenuItem.Click += Stop; filesListBox.Items.Clear(); imageInformationTextBox.Clear(); pictureBox.Image = null; imageWorks?.img?.Dispose(); //---пуск задачи---// cancelTokenSource = new CancellationTokenSource(); token = cancelTokenSource.Token; isWorking = true; await finder.GetImagesWithMyParams(iso, date, et, ep, or, isDSC, camName, isManualWhiteBalance, isFlashOn, isGPS, isEdit, token); isWorking = false; // MessageBox.Show(searchSettings.ToString() + "\nНайдено изображений: " + imagesBindingSource.Count); //------------------// status.Text = "Поиск окончен"; // imagesBindingSource.DataSource = images; //---кнопка меняется на старт startButton.Text = "Начать поиск"; startButton.Click += StartSearch; startButton.Click -= Stop; searchToolStripMenuItem.Text = "Начать поиск"; searchToolStripMenuItem.Click += StartSearch; searchToolStripMenuItem.Click -= Stop; if (WindowState == FormWindowState.Minimized) { //мигание значка на панели задач, когда поиск завершен (если окно свернуто) FLASHWINFO fwi = new FLASHWINFO(); fwi.cbSize = Marshal.SizeOf(fwi); fwi.hwnd = Handle; fwi.dwFlags = 0x00000002; fwi.dwTimeout = 0; fwi.uCount = 5; FlashWindowEx(ref fwi); } #if DEBUG #region Tests Console.WriteLine("Tests..."); //---тестируем поиск по датам, удалить в релизе if (datesCheckBox.Checked) { foreach (var i in filesListBox.Items) { var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault(); var dbdate = sdir.GetDateTime(ExifDirectoryBase.TagDateTimeOriginal).Date; Debug.Assert((dbdate >= startDateTimePicker.Value.Date) && (dbdate <= endDateTimePicker.Value.Date), "DateTime Bug: " + ((ImageInformation)i).FileName); } } //---тестируем баланс белого (ручной) if (WhiteBalanceСheckBox.Checked) { foreach (var i in filesListBox.Items) { var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault(); var wb = sdir.GetUInt16(ExifDirectoryBase.TagWhiteBalanceMode); Debug.Assert(wb == 1, "White Balance Bug: " + ((ImageInformation)i).FileName); } } //---тестируем источник снимка if (DSCCheckBox.Checked) { foreach (var i in filesListBox.Items) { var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault(); var dsc = sdir.GetUInt16(ExifDirectoryBase.TagFileSource); Debug.Assert(dsc == 3, " DSC Bug: " + ((ImageInformation)i).FileName); } } //---тестируем модель камеры, удалить в релизе if (cameraCheckBox.Checked) { foreach (var x in filesListBox.Items) { if (x is ImageInformation) { var sdir = ((ImageInformation)x).Directories.OfType <ExifIfd0Directory>().FirstOrDefault(); var cam = sdir.GetDescription(ExifIfd0Directory.TagMake); cam = cam.ToLower(); Debug.Assert(cam.Contains(camName.ToLower()), "Неверно отработал поиск по камере" + ((ImageInformation)x).FileName); } } } //---тестируем выдержку, удалить в релизе if (ExposureTimeCheckBox.Checked) { foreach (var i in filesListBox.Items) { var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault(); Rational minExposureTime; Rational maxExposureTime; bool isMinValueCorrect = GetRationalFromString(minExposureTimeTextBox.Text, out minExposureTime); bool isMaxValueCorrect = GetRationalFromString(maxExposureTimeTextBox.Text, out maxExposureTime); if (isMinValueCorrect == true && isMaxValueCorrect == true) { double min = minExposureTime.ToDouble(); double max = maxExposureTime.ToDouble(); double exptime = sdir.GetRational(ExifDirectoryBase.TagExposureTime).ToDouble(); Debug.Assert((exptime >= min - double.Epsilon) && (exptime <= max + double.Epsilon), "Exposure Bug: " + ((ImageInformation)i).FileName + " " + exptime); } } } //тестируем ISO if (ISOCheckBox.Checked) { foreach (var i in filesListBox.Items) { var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault(); var dbiso = sdir.GetUInt16(ExifDirectoryBase.TagIsoEquivalent); Debug.Assert((dbiso >= ushort.Parse(minISOTextBox.Text)) && (dbiso <= ushort.Parse(maxISOTextBox.Text)), "ISO Bug: " + ((ImageInformation)i).FileName); } } //тестируем вспышку if (flashOnCheckBox.Checked) { foreach (var i in filesListBox.Items) { var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault(); ushort flash = sdir.GetUInt16(ExifDirectoryBase.TagFlash); Debug.Assert((flash & 0x1) != 0, "Flash Bug: " + ((ImageInformation)i).FileName + "Flash value: " + flash); } } //тестируем программу экспозиции if (ExposureProgramCheckBox.Checked) { foreach (var i in filesListBox.Items) { var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault(); ushort eProgram = sdir.GetUInt16(ExifDirectoryBase.TagExposureProgram); Debug.Assert(eProgram == (int)exposureProgramComboBox.SelectedIndex + 1, "Exposure Program Bug: " + ((ImageInformation)i).FileName + " EP Value: " + eProgram); } } //тестируем ориентацию if (ExposureProgramCheckBox.Checked) { foreach (var i in filesListBox.Items) { var sdir = ((ImageInformation)i).Directories.OfType <ExifIfd0Directory>().FirstOrDefault(); ushort orient = sdir.GetUInt16(ExifDirectoryBase.TagOrientation); if (or == Orientation.Horizonatal) { Debug.Assert(orient <= 4, "Orientation bug"); } if (or == Orientation.Vertical) { Debug.Assert(orient > 4, "Orientation bug"); } } } #endregion #endif } else { MessageBox.Show("Путь указан неверно!", "WhereIsMyPhoto"); } }