bsl-language-server icon indicating copy to clipboard operation
bsl-language-server copied to clipboard

[FP] Не видит удаление временного файла

Open BityutskiyNA opened this issue 1 year ago • 4 comments

Диагностика

Нужно добавить удаление временного файла после использования MissingTemporaryFileDeletion

Версия

1.14.

Описание ложного срабатывания диагностики

В модуле по определенным условиям создаются файлы с помощью процедуры ПолучитьИмяВременногоФайла() Далее в модуле по этим же условиям эти файлы удаляются но все равно выводит ошибку.

Пример кода

Если ДождатьсяЗавершения Тогда 
	Если ПолучитьПотокВывода Тогда 
		ИмяФайлаПотокаВывода = ПолучитьИмяВременногоФайла("stdout.tmp");
		СтрокаКоманды = СтрокаКоманды + " > """ + ИмяФайлаПотокаВывода + """";
	КонецЕсли;
	
	Если ПолучитьПотокОшибок Тогда 
		ИмяВременногоФайлаПотокаОшибок = ПолучитьИмяВременногоФайла("stderr.tmp");
		СтрокаКоманды = СтрокаКоманды + " 2>""" + ИмяВременногоФайлаПотокаОшибок + """";
	КонецЕсли;
КонецЕсли;

Если КодировкаПотоков = Неопределено Тогда 
	КодировкаПотоков = КодировкаСтандартныхПотоков();
КонецЕсли;

КодВозврата = Неопределено;

Если ОбщегоНазначения.ЭтоWindowsСервер() Тогда
	
	ИмяФайлаКоманды = ПолучитьИмяВременногоФайла("run.bat");
	ТекстовыйДокумент = РаботаСФайламиСлужебныйКлиентСервер.НовыйФайлЗапускаКомандыWindows(
		СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодировкаИсполнения);
	ТекстовыйДокумент.Записать(ИмяФайлаКоманды, КодировкаПотоков);
	
	Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
		// В файловой информационной базе показывать окно консоли не следует и в серверном контексте.
		Оболочка = Новый COMОбъект("Wscript.Shell");
		КодВозврата = Оболочка.Run(ИмяФайлаКоманды, 0, ДождатьсяЗавершения);
		Оболочка = Неопределено;
	Иначе 
		ЗапуститьПриложение(ИмяФайлаКоманды,, ДождатьсяЗавершения, КодВозврата);
	КонецЕсли;
	
	Если ДождатьсяЗавершения Тогда
		// Автоматически удаление включено только в случае не ожидания завершения, т.к. код возврата там не интересен.
		// В случае, когда нужен корректный код возврата автоматического удаления нет, потому следует удалить файл здесь.
		УдалитьВременныйФайл(ИмяФайлаКоманды);
	КонецЕсли;
Иначе
	ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодВозврата);
КонецЕсли;

ПотокВывода = "";
ПотокОшибок = "";

Если ДождатьсяЗавершения Тогда 
	Если ПолучитьПотокВывода Тогда
		ПотокВывода = ПрочитатьФайлЕслиСуществует(ИмяФайлаПотокаВывода, КодировкаПотоков);
		УдалитьВременныйФайл(ИмяФайлаПотокаВывода);
	КонецЕсли;
	
	Если ПолучитьПотокОшибок Тогда 
		ПотокОшибок = ПрочитатьФайлЕслиСуществует(ИмяВременногоФайлаПотокаОшибок, КодировкаПотоков);
		УдалитьВременныйФайл(ИмяВременногоФайлаПотокаОшибок);
	КонецЕсли;
КонецЕсли;

Скриншоты

сонар скрин

Дополнительная информация

BityutskiyNA avatar Jul 23 '24 15:07 BityutskiyNA

А сколько срабатываний суммарно в этом куске кода у вас? Два или три?

nixel2007 avatar Jul 28 '24 14:07 nixel2007

А сколько срабатываний суммарно в этом куске кода у вас? Два или три?

Два. image

BityutskiyNA avatar Jul 29 '24 07:07 BityutskiyNA

А если переменную ИмяВременногоФайлаПотокаОшибок определить до первого условия во вложенном условии? Сейчас она, по сути, локальная для блока условия

theshadowco avatar Jul 29 '24 12:07 theshadowco

А если переменную ИмяВременногоФайлаПотокаОшибок определить до первого условия во вложенном условии? Сейчас она, по сути, локальная для блока условия

Не исправило ситуацию.

image

BityutskiyNA avatar Aug 01 '24 06:08 BityutskiyNA