Руководство - Директивы компилятора (для различного поведения на различных OS)
Это будет нашим последним визитом в программу сбора Свойств Файлов. Осталось последнее ограничение, которое мы должны преодолеть. Мы его оставили напоследок, потому что оно представляет собой особый случай.Declare.s AttributeString(Attributes.l)
Добавить эту новую процедуру в раздел реализации.Procedure.s AttributeString(Attributes.l) ; Преобразует целочисленное значение атрибута в строковый вид. ; Поддерживаются атрибуты системы Linux, Mac и Windows. Protected.s Result Result = "" CompilerIf #PB_Compiler_OS = #PB_OS_Windows ; Это атрибуты для систем Windows. ; Логическое И значения Attributes с каждой константой отфильтровывают заданный бит и затем используются для сравнения. If Attributes & #PB_FileSystem_Archive Result + "A" Else Result + " " EndIf If Attributes & #PB_FileSystem_Compressed Result + "C" Else Result + " " EndIf If Attributes & #PB_FileSystem_Hidden Result + "H" Else Result + " " EndIf If Attributes & #PB_FileSystem_ReadOnly Result + "R" Else Result + " " EndIf If Attributes & #PB_FileSystem_System Result + "S" Else Result + " " EndIf CompilerElse ; Это атрибуты для систем Mac и Linux. If Attributes & #PB_FileSystem_Link Result + "L " Else Result + " " EndIf ; Атрибуты пользователя. If Attributes & #PB_FileSystem_ReadUser Result + "R" Else Result + " " EndIf If Attributes & #PB_FileSystem_WriteUser Result + "W" Else Result + " " EndIf If Attributes & #PB_FileSystem_ExecUser Result + "X " Else Result + " " EndIf ; Групповые атрибуты. If Attributes & #PB_FileSystem_ReadGroup Result + "R" Else Result + " " EndIf If Attributes & #PB_FileSystem_WriteGroup Result + "W" Else Result + " " EndIf If Attributes & #PB_FileSystem_ExecGroup Result + "X " Else Result + " " EndIf ; Все атрибуты. If Attributes & #PB_FileSystem_ReadAll Result + "R" Else Result + " " EndIf If Attributes & #PB_FileSystem_WriteAll Result + "W" Else Result + " " EndIf If Attributes & #PB_FileSystem_ExecAll Result + "X" Else Result + " " EndIf CompilerEndIf ; Возврат результата ProcedureReturn Result EndProcedure
Наконец, замените эти две строки в процедуре ListLoad; Преобразовывает атрибуты в строку. Attrib = StrU(Files()\Attributes)
с ними,; Вызов AttributeString для преобразования атрибутов в строковое представление. Attrib = AttributeString(Files()\Attributes)
Теперь, при выполнении программы, на экране будут отображаться строковые данные вместо целочисленных значений. В системе Windows это выглядело бы примерно так (предполагается, что все атрибуты установлены):ACHRSи в других двух системах:
L RWX RWX RWXИнструкция CompilerIf очень похожа на инструкцию IF однако компилятор принимает решение во время компиляции, а не во время выполнения. Это означает, что мы можем включать разный код для обработки атрибутов файлов в разных операционных системах.
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
иCompilerElseбудут компилироваться в системах Windows. Константа #PB_Compiler_OS определяется в PureBasic автоматически, что позволяет работать в программе такому виду логики.
CompilerSelect #PB_Compiler_OS CompilerCase #PB_OS_Linux ; Код для систем Linux. CompilerCase #PB_OS_MacOS ; Код для систем Mac. CompilerCase #PB_OS_Windows ; Код для систем Windows. CompilerEndSelect
Последняя директива компилятора, которую мы собираемся обсудить это: EnableExplicit.EnableExplicit Define.l Field, FieldMax ; ... If Field < FieldMax ; Если EnableExplicit не включен, этот раздел кода может не выполняться когда должен, потому что FieldMax будет нулевым. EndIf
Навигация Руководства
< Структурирование кода в Процедурах - Обзор - Чтение и запись файлов >