Lugaru's Epsilon
Programmer's
Editor

Context:
Epsilon User's Manual and Reference
   Primitives and EEL Subroutines
      . . .
      Display Primitives
         Creating & Destroying Windows
         Window Resizing Primitives
         Preserving Window Arrangements
         . . .
         Colors
      File Primitives
         . . .
         Character Encoding Conversions
         More File Primitives
         File Properties
         Low-level File Primitives
         Directories
         . . .
      Operating System Primitives
         System Primitives
         Window System Primitives
         Timing
         Calling Windows DLLs
         Running a Process
      . . .

Previous   Up    Next
More File Primitives  Primitives and EEL Subroutines   Low-level File Primitives


Epsilon User's Manual and Reference > Primitives and EEL Subroutines > File Primitives >

File Properties

int check_file(char *file, ?struct file_info *f_info)

The check_file( ) primitive gets miscellaneous information on a file or subdirectory from the operating system. It returns codes defined by macros in codes.h. If its argument file denotes a pattern that may match multiple files, it returns CHECK_PATTERN. (Use the file_match( ) primitive described in Listing Commands & Buffers & Files to retrieve the matches.) If file names a directory or a file, it returns CHECK_DIR or CHECK_FILE, respectively. If file names a device, it returns CHECK_DEVICE. If file has the form of a URL, not a regular file, it returns CHECK_URL.

Under operating systems that support it, check_file( ) returns CHECK_PIPE for a named pipe and CHECK_OTHER for an unrecognized special file. Otherwise, it returns 0. If f_info has a non-null value, check_file( ) fills the structure it points to with information on the file or directory, except when it returns 0 or CHECK_URL. The structure has the following format (defined in eel.h):

struct file_info {      /* returned by check_file() */
        int fsize;      /* file size in bytes */
        int fsize_high; /* file size can be over 32 bits */
        int opsysattr;  /* system dependent attribute */
        int raw_file_date_high;
                    /* opsys-dependent date: high 32 bits */
        int raw_file_date_low; /* low 32 bits */
        short year;     /* file date: 1980-2099 */
        short month;    /* 1-12 */
        short day;      /* 1-31 */
        short hour;     /* 0-23 */
        short minute;   /* 0-59 */
        short second;   /* 0-59 */
        byte attr;      /* epsilon standardized attribute */
        byte check_type; /* file/directory/device code */
};
#define ATTR_READONLY   1
#define ATTR_DIRECTORY  2

The check_type member contains the same value as check_file( )'s return code. The attr member contains two flags: ATTR_READONLY if the file cannot be written, or ATTR_DIRECTORY if the operating system says the file is actually a directory. The opsysattr member contains a raw attribute code from the operating system: the meaning of bits here depends on the operating system, and Epsilon doesn't interpret them. (See the set_file_opsys_attribute( ) primitive to set raw attribute codes for a file.)

Epsilon also provides the timestamp of a file, in two formats. The interpreted format (year, month, etc.) uses local time, and is intended to match the file timestamp shown in a directory listing. By contrast, in most cases the raw timestamp (in seconds) won't be affected by a change in time zones, the arrival of daylight savings time, or similar things, as the interpreted format will be. Under some operating systems Epsilon doesn't provide a raw timestamp; these two fields will be zero in that case.

For the second parameter to check_file( ), make sure you provide a pointer to a struct file_info, not the actual structure itself. You can omit this parameter entirely if you only want the function's return value.

unique_filename_identifier(char *fname, int id[3])
unique_file_ids_match(int a[3], int b[3])

The unique_filename_identifier( ) primitive takes a file name and fills the id array with a set of values that uniquely describe it. Two file names with the same array of values refer to the same file. (This can happen under Unix due to symbolic or hard links.) If the primitive sets id[0] to zero, no unique identifier was found; comparisons between two file names, one or both of which return id[0]==0, must assume that the names might or might not refer to the same file. At this writing only Epsilon for Unix supports this feature; in other versions, unique_filename_identifier( ) will always set id[0] to zero.

The unique_file_ids_match( ) subroutine compares two id arrays from unique_filename_identifier( ), returning nonzero if they indicate the two file names supplied to unique_filename_identifier( ) refer to the same file, and zero if they do not, or Epsilon cannot determine this.

int compare_dates(struct file_info *a,
                  struct file_info *b)
format_date(char *msg, int year, int month,
            int day, int hour, int minute,
            int second)
format_file_date(char *s, struct file_info *p)

The compare_dates( ) subroutine defined in filedate.e can be used to compare the dates in two file_info structures. It returns 0 if they have the same date and time, a negative number if a is dated earlier than b, or positive if a is dated later than b.

The format_date( ) subroutine takes a date and converts it to text form, using the format specified by the date-format variable. The format_file_date( ) subroutine takes a file_info structure and converts it to text form by calling format_date( ).

int check_dates(int save)               /* filedate.e */

The check_dates( ) subroutine defined in filedate.e compares a file's time and date on disk with the date saved when the file was last read or written. If the file on disk has a later date, it warns the user and asks what to do. Its parameter should be nonzero if Epsilon was about to save the file, otherwise zero. The function returns nonzero if the user said not to save the file.

The following example command uses check_file( ) to display the current file name and its date in the echo area.

#include "eel.h"

command show_file_date()
{
    struct file_info ts;

    if (check_file(filename, &ts))
        say("%s: %d/%d/%d", filename,
                    ts.month, ts.day, ts.year);
}



Previous   Up    Next
More File Primitives  Primitives and EEL Subroutines   Low-level File Primitives


Lugaru Copyright (C) 1984, 2012 Lugaru Software Ltd. All Rights Reserved.