====== 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.