====== Writing File Attributes ====== === The Code === Below is the code to call [[https://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/setfileattributes.asp|SetFileAttributes()]] to make C:\AREADING.TAB a read-only file with the archive bit set. The attributes are set, and then [[https://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/getfileattributes.asp|GetFileAttributes()]] is called to prove that the declare function SetFileAttributes, GetFileAttributes filename = 'C:\areading.tab' EQU FILE_ATTRIBUTE_READONLY$ to 1 EQU FILE_ATTRIBUTE_HIDDEN$ to 2 EQU FILE_ATTRIBUTE_SYSTEM$ to 4 EQU FILE_ATTRIBUTE_DIRECTORY$ to 16 EQU FILE_ATTRIBUTE_ARCHIVE$ to 32 /* NORMAL is a file with neither the readonly, hidden, nor archive bits set */ EQU FILE_ATTRIBUTE_NORMAL$ to 128 EQU FILE_ATTRIBUTE_TEMPORARY$ to 256 rv = SetFileAttributes (filename, FILE_ATTRIBUTE_READONLY$ + FILE_ATTRIBUTE_ARCHIVE$) attributes = GetFileAttributes (filename) if bitand( attributes , FILE_ATTRIBUTE_READONLY$) then call msg( filename : ' is a readonly file.') end if bitand( attributes , FILE_ATTRIBUTE_HIDDEN$) then call msg( filename : ' is hidden file.') end if bitand( attributes , FILE_ATTRIBUTE_SYSTEM$) then call msg( filename : ' is system file.') end if bitand( attributes , FILE_ATTRIBUTE_DIRECTORY$) then call msg( filename : ' is directory.') end if bitand( attributes , FILE_ATTRIBUTE_ARCHIVE$) then call msg( filename : ' is an archive file.') end if bitand( attributes , FILE_ATTRIBUTE_NORMAL$) then call msg( filename : ' is a normal file.') end if bitand( attributes , FILE_ATTRIBUTE_TEMPORARY$) then call msg( filename : ' is a temporary file.') end call msg(@window , 'attributes = ': attributes) Note how the values for the attribute bits are added. The attribute value returned from [[https://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/setfileattributes.asp|SetFileAttributes()]] is 33 (32 for the archive bit, plus 1 for the read-only bit). === The Windows API Declaration === The code above will not run until the declarations for [[https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getenvironmentvariable.asp|GetFileAttributes()]] and [[https://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/setfileattributes.asp|SetFileAttributes()]] have been added. To add the declaration, do the following: * Log out of the application. * Log into the SYSPROG application. * Add a row, (call it DLL_APICALLS_KERNEL32), with the first line as KERNEL32 and containing the declarations as shown below. KERNEL32 LONG STDCALL GetFileAttributesA(LPCHAR) as GetFileAttributes LONG STDCALL SetFileAttributesA(LPCHAR, ULONG) as SetFileAttributes //....add any other declarations in KERNEL32 here..... The function is aliased to its ANSI version GetFileAttributesA(). * Save the row. * Run [[Declare_FCNS|Declare_FCNS]] at the System Editor Exec Line to create the declaration header, as shown below: RUN DECLARE_FCNS 'DLL_APICALLS_KERNEL32' * Exit the editor. * Log out of SYSPROG. * Log into your application. * Run the window.