У меня есть блок кода, который выполняется внутри C # и создает процесс для распаковки (разархивирования и разархивирования) файла. При новой перезагрузке моего компьютера я могу вызвать приведенный ниже блок кода, и мой файл распаковывается в течение одной или двух секунд. Однако в какой-то момент приведенный ниже код полностью перестает работать (пока я не выполню перезагрузку).
Process bashProcess = new Process();
bashProcess.StartInfo.FileName = ConfigurationManager.AppSettings["Util.CygwinPath"];
bashProcess.StartInfo.Arguments = String.Format(
"--login -c \"tar --overwrite --gzip --directory={0} -xf {1}\"",
unixPath.Replace(fileName, ""), unixPath);
bashProcess.StartInfo.RedirectStandardError = true;
bashProcess.StartInfo.RedirectStandardInput = true;
bashProcess.StartInfo.RedirectStandardOutput = true;
bashProcess.StartInfo.CreateNoWindow = true;
bashProcess.StartInfo.UseShellExecute = false;
bashProcess.StartInfo.ErrorDialog = false;
bashProcess.Start();
bashProcess.WaitForExit(10000);
Я пробовал несколько вещей, в том числе:
- Захват StandardOutput и запись его, чтобы очистить его буфер. (ничего не было зарегистрировано)
- Возьмите StandardError и зарегистрируйте его, чтобы очистить его буфер. (ничего не было зарегистрировано)
- Завершение процесса впоследствии (вручную и программно) в случае, если предыдущий процесс удерживал файл, который я распаковываю.
- Удаление и переустановка файла, который я распаковываю, на случай, если он был задержан процессом зомби.
Что может заставить Процесс просто не работать? Он не выдает ошибку, он просто зависает до тех пор, пока не истечет время ожидания от WaitForExit (10000).
UPDATE
Я не регистрирую окончательное значение bashProcess.StartInfo.Arguments , но я взял это значение и убедился, что Cygwin может его запустить. При запуске из Cygwin файл распаковывается, как и ожидалось. Полная команда выглядит следующим образом:
bash.exe --login -c "tar --overwrite --gzip --directory=/cygdrive/mypath/mydir -xf /cygdrive/mypath/mydir/myfile.tar.gz"
Я запускаю приведенный выше код прямо из Visual Studio 2015.
Еще одна странная вещь, которую я заметил на своей машине, это то, что время загрузки Cygwin является переменным. Сразу после новой перезагрузки Cygwin можно открыть за считанные секунды. После того, как мой компьютер работает некоторое время, Cygwin может занять до 3 или 5 минут, чтобы открыть. Интересно, связаны ли время загрузки Cygwin и моя проблема в этом вопросе?
ОБНОВЛЕНИЕ 2
Похоже, что увеличение скорости Cygwin на моем компьютере является источником проблемы, хотя я не знаю, почему Cygwin замедляется с течением времени. Я заметил, что мой код выше в итоге завершил , но это заняло несколько минут дольше, чем ожидалось (код выше должен завершиться через 1-2 секунды).