У меня проблема с моей программой Winforms C #. Я хочу отобразить индикатор выполнения во время копирования файлов с локального диска на сетевой диск, но он не работает. Что я делаю неправильно?
Как только у меня возникла эта проблема в WPF, я решил ее с помощью 'Dispatcher', но в Winforms я думаю, что-то вроде этого не существует. Код ниже, спасибо за помощь.
private void copyFiles(string SourcePath, string DestinationPath)
{
string SourcePath, DestinationPath;
int i = 0, idOperatDetail, udane = 0;
OperatDetail operatDetail = null;
if (circularProgressBar1.InvokeRequired)
{
circularProgressBar1.BeginInvoke((Action)(() => circularProgressBar1.Enabled = true));
circularProgressBar1.BeginInvoke((Action)(() => circularProgressBar1.Visible = true));
circularProgressBar1.BeginInvoke((Action)(() => circularProgressBar1.Style = ProgressBarStyle.Marquee));
}
else
{
circularProgressBar1.Enabled = true;
circularProgressBar1.Visible = true;
}
foreach (string sourceFile in Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".jpg") || s.EndsWith(".tif")))
{
i++;
}
if (i != 0)
{
// Jest urobek to utworz foldery
foreach (string dirPath in Directory.GetDirectories(SourcePath, "*", SearchOption.AllDirectories))
{
if (!Directory.Exists(dirPath.Replace(SourcePath, DestinationPath)))
{
Directory.CreateDirectory(dirPath.Replace(SourcePath, DestinationPath));
}
}
foreach (string sourceFile in Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".jpg") || s.EndsWith(".tif")))
{
string tempSchemat = sourceFile.Replace(SourcePath, "");
var txt = tempSchemat.Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
string schemat = "digitalizacja_" + txt[0].ToLower();
if (operatDetailsUtils.DidDatabaseExists(schemat) == 0)
{
operatDetail = operatDetailsUtils.GetOperatDetailIdByPath(schemat, sourceFile); // Pobierz ten szczegół z bazy danych
if (operatDetail != null) // If file have record in database then get its metadata
{
idOperatDetail = operatDetail.Id;
Image img = Image.FromFile(sourceFile);
long size = (new FileInfo(sourceFile).Length);
int width = img.Width;
int height = img.Height;
float horResolution = img.HorizontalResolution;
float verResolution = img.VerticalResolution;
img.Dispose();
string destinationFile = sourceFile.Replace(SourcePath, DestinationPath);
// if (size < FreeSpace(DestinationPath)) // Walidacja rozmiaru pliku kopiowanego
{
File.Copy(sourceFile, destinationFile, true);
Image imgDest = Image.FromFile(destinationFile);
long sizeDest = (new FileInfo(destinationFile).Length);
int widthDest = imgDest.Width;
int heightDest = imgDest.Height;
float horResolutionDest = imgDest.HorizontalResolution;
float verResolutionDest = imgDest.VerticalResolution;
imgDest.Dispose(); // Porównanie metadanych
if ((size != sizeDest) || (width != widthDest) || (height != heightDest) || (horResolution != horResolutionDest) || (verResolution != verResolutionDest))
{
File.Delete(destinationFile); // Metadane sie nie zgadzaja
slog.Error($"Plik o scieżce {destinationFile} ma inne metadane niż {sourceFile}. Został on usunięty ze względu na to, że został źle skopiowany");
}
else
{
udane++;
operatDetailsUtils.UpdatePath(schemat, idOperatDetail, destinationFile);
File.Delete(sourceFile);
slog.Info($"Plik {sourceFile} został poprawnie skopiowany na dysk sieciowy, a więc został usunięty z dysku lokalnego.");
}
}
}
else
{
slog.Error($"W bazie danych {schemat} w tabeli OPERAT_SZCZEGOLY nie istnieje plik o ścieżce {sourceFile} i nie został on skopiowany");
}
}
else
{
slog.Error($"Baza danych {schemat} nie istnieje!");
}
}
circularProgressBar1.BeginInvoke((Action)(() => circularProgressBar1.Enabled = false));
circularProgressBar1.BeginInvoke((Action)(() => circularProgressBar1.Visible = false));
}