PROCEDURE ForceDirectories STRING IN aPath aPath sysutils:ForceDirectories ?ASSURE [ 'Не удалось создать директорию ' aPath ] ; // ForceDirectories FILE FUNCTION TryOpen: STRING IN aFileName ^ IN aOpenLambda %SUMMARY 'Открывает файл aFileName методом aOpenLambda обрабатывая ошибки открытия' 'Пытается открыть файл повторно несколько раз.' ; VAR l_TryCount 10 >>> l_TryCount while ( l_TryCount > 0 ) begin TRY aFileName aOpenLambda DO >>> Result 0 >>> l_TryCount EXCEPT Dec l_TryCount nil >>> Result if ( l_TryCount 0 == ) then RAISE else begin [ 'Файл ' aFileName ' был занят. Ожидаем его освобождения. Попытка номер: ' l_TryCount IntToStr ] strings:Cat >>std::out 500 SLEEP end // ( l_TryCount 0 == ) END // TRY..EXCEPT end // ( l_TryCount > 0 ) ; // TryOpen: FILE FUNCTION MakePathAndOpenWrite STRING IN aFileName %SUMMARY 'Открывает файл aFileName на запись.' 'Если надо - создаёт полный путь на файловой системе.' ; aFileName sysutils:ExtractFilePath ForceDirectories aFileName TryOpen: File:OpenWrite >>> Result ; // MakePathAndOpenWrite ... PROCEDURE ReadUCFromFile STRING IN aFileName STRING IN aCurrentGeneratedElementPrefix if ( aFileName sysutils:FileExists ) then begin FILE VAR l_In aFileName TryOpen: File:OpenRead >>> l_In TRY VAR l_UCOpened ARRAY VAR l_Accumulated STRING VAR l_Key false >>> l_UCOpened l_In File:ReadLines ( IN aStr VAR l_Pos : Has string:Pos >>> l_Pos l_Pos -1 != ; // Has RULES ( aStr cUCStart Has ) ( l_UCOpened ! ?ASSURE [ 'Секция кода уже открыта. Файл: ' aFileName ' строка:' aStr ] true >>> l_UCOpened aStr string:Trim >>> aStr [] >>> l_Accumulated aStr >>> l_Key '*' string:SplitTo! l_Key DROP ) ( aStr cUCEnd Has ) ( l_UCOpened ?ASSURE [ 'Секция кода не открыта. Файл: ' aFileName ' строка:' aStr ] false >>> l_UCOpened VAR l_Head if ( l_Pos > 0 ) then begin l_Pos 0 aStr string:Substring >>> l_Head if ( l_Head string:TrimLeft IsNil ! ) then begin l_Head array:AddTo l_Accumulated aStr string:Len l_Pos - l_Pos aStr string:Substring >>> aStr end // ( l_Head IsNil ! ) end // ( l_Pos > 0 ) aStr string:Trim >>> aStr g_CurrentGenerator ->^ l_Key ^:= l_Accumulated g_CurrentGenerator ->^ ( aCurrentGeneratedElementPrefix l_Key Cat ) ^:= l_Accumulated nil >>> l_Accumulated ) DEFAULT ( l_UCOpened ? ( aStr array:AddTo l_Accumulated ) // l_UCOpened ? ) ; // RULES ) // l_In File:ReadLines FINALLY nil >>> l_In END // TRY..FINALLY end // ( aFileName sysutils:FileExists ) ; // ReadUCFromFile
Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
четверг, 7 апреля 2016 г.
#1214. Обработка ошибок открытия файлов через лямбды
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий