plugins/include/files.inc
author David Anderson <dvander@alliedmods.net>
Fri Jul 11 05:14:32 2008 +0000 (2008-07-11)
branchrefac-jit
changeset 2190 880e81f30b5e
parent 2168 c24a6fa957db
child 2289 44045ead61cd
permissions -rw-r--r--
GetContext() now returns 'this' as a hack (shouldn't+can't be accessed anyway)
dvander@2168
     1
/**
dvander@2168
     2
 * vim: set ts=4 :
dvander@2168
     3
 * =============================================================================
dvander@2168
     4
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
dvander@2168
     5
 * =============================================================================
dvander@2168
     6
 *
dvander@2168
     7
 * This file is part of the SourceMod/SourcePawn SDK.
dvander@2168
     8
 *
dvander@2168
     9
 * This program is free software; you can redistribute it and/or modify it under
dvander@2168
    10
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2168
    11
 * Free Software Foundation.
dvander@2168
    12
 * 
dvander@2168
    13
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2168
    14
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2168
    15
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@2168
    16
 * details.
dvander@2168
    17
 *
dvander@2168
    18
 * You should have received a copy of the GNU General Public License along with
dvander@2168
    19
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@2168
    20
 *
dvander@2168
    21
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2168
    22
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2168
    23
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2168
    24
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@2168
    25
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@2168
    26
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@2168
    27
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2168
    28
 * or <http://www.sourcemod.net/license.php>.
dvander@2168
    29
 *
dvander@2168
    30
 * Version: $Id$
dvander@2168
    31
 */
dvander@2168
    32
dvander@2168
    33
#if defined _files_included
dvander@2168
    34
 #endinput
dvander@2168
    35
#endif
dvander@2168
    36
#define _files_included
dvander@2168
    37
dvander@2168
    38
/**
dvander@2168
    39
 * @global All paths in SourceMod natives are relative to the mod folder 
dvander@2168
    40
 * unless otherwise noted.
dvander@2168
    41
 *
dvander@2168
    42
 * Most functions in SourceMod (at least, ones that deal with direct 
dvander@2168
    43
 * file manipulation) will support an alternate path specification.
dvander@2168
    44
 *
dvander@2168
    45
 * If the path starts with the string "file://" and the PathType is 
dvander@2168
    46
 * not relative, then the "file://" portion is stripped off, and the 
dvander@2168
    47
 * rest of the path is used without any modification (except for 
dvander@2168
    48
 * correcting slashes).  This can be used to override the path 
dvander@2168
    49
 * builder to supply alternate absolute paths.  Examples:
dvander@2168
    50
 *
dvander@2168
    51
 * file://C:/Temp/file.txt
dvander@2168
    52
 * file:///tmp/file.txt
dvander@2168
    53
 */
dvander@2168
    54
dvander@2168
    55
/**
dvander@2168
    56
 * File inode types.
dvander@2168
    57
 */
dvander@2168
    58
enum FileType
dvander@2168
    59
{
dvander@2168
    60
	FileType_Unknown = 0,	/* Unknown file type (device/socket) */
dvander@2168
    61
	FileType_Directory = 1,	/* File is a directory */
dvander@2168
    62
	FileType_File = 2,		/* File is a file */
dvander@2168
    63
};
dvander@2168
    64
dvander@2168
    65
/**
dvander@2168
    66
 * File time modes.
dvander@2168
    67
 */
dvander@2168
    68
enum FileTimeMode
dvander@2168
    69
{
dvander@2168
    70
	FileTime_LastAccess = 0,	/* Last access (does not work on FAT) */
dvander@2168
    71
	FileTime_Created = 1,		/* Creation (does not work on FAT) */
dvander@2168
    72
	FileTime_LastChange = 2,	/* Last modification */
dvander@2168
    73
};
dvander@2168
    74
dvander@2168
    75
#define PLATFORM_MAX_PATH		256		/**< Maximum path length. */
dvander@2168
    76
dvander@2168
    77
#define SEEK_SET 0						/**< Seek from start. */
dvander@2168
    78
#define SEEK_CUR 1						/**< Seek from current position. */
dvander@2168
    79
#define SEEK_END 2						/**< Seek from end position. */
dvander@2168
    80
dvander@2168
    81
/**
dvander@2168
    82
 * Path types.
dvander@2168
    83
 */
dvander@2168
    84
enum PathType
dvander@2168
    85
{
dvander@2168
    86
	Path_SM,		/**< SourceMod root folder */	
dvander@2168
    87
};
dvander@2168
    88
dvander@2168
    89
/**
dvander@2168
    90
 * Builds a path relative to the SourceMod folder.  This should be used instead of 
dvander@2168
    91
 * directly referencing addons/sourcemod, in case users change the name of their 
dvander@2168
    92
 * folder layout.
dvander@2168
    93
 *
dvander@2168
    94
 * @param type			Type of path to build as the base.
dvander@2168
    95
 * @param buffer		Buffer to store the path.
dvander@2168
    96
 * @param maxlength		Maximum length of buffer.
dvander@2168
    97
 * @param fmt			Format string.
dvander@2168
    98
 * @param ...			Format arguments.
dvander@2168
    99
 * @return				Number of bytes written to buffer (not including null terminator).
dvander@2168
   100
 */
dvander@2168
   101
native BuildPath(PathType:type, String:buffer[], maxlength, const String:fmt[], any:...);
dvander@2168
   102
dvander@2168
   103
/**
dvander@2168
   104
 * Opens a directory/folder for contents enumeration.
dvander@2168
   105
 *
dvander@2168
   106
 * @note Directories are closed with CloseHandle().
dvander@2168
   107
 * @note Directories Handles can be cloned.
dvander@2168
   108
 * @note OpenDirectory() supports the "file://" notation.
dvander@2168
   109
 *
dvander@2168
   110
 * @param path			Path to open.
dvander@2168
   111
 * @return				A Handle to the directory, INVALID_HANDLE on open error.
dvander@2168
   112
 */
dvander@2168
   113
native Handle:OpenDirectory(const String:path[]);
dvander@2168
   114
dvander@2168
   115
/**
dvander@2168
   116
 * Reads the current directory entry as a local filename, then moves to the next file.
dvander@2168
   117
 *
dvander@2168
   118
 * @note Contents of buffers are undefined when returning false.
dvander@2168
   119
 * @note Both the '.' and '..' automatic directory entries will be retrieved for Windows and Linux.
dvander@2168
   120
 * 
dvander@2168
   121
 * @param dir			Handle to a directory.
dvander@2168
   122
 * @param buffer		String buffer to hold directory name.
dvander@2168
   123
 * @param maxlength		Maximum size of string buffer.
dvander@2168
   124
 * @param type			Optional variable to store the file type.
dvander@2168
   125
 * @return				True on success, false if there are no more files to read.
dvander@2168
   126
 * @error				Invalid or corrupt Handle. 
dvander@2168
   127
 */
dvander@2168
   128
native bool:ReadDirEntry(Handle:dir, String:buffer[], maxlength, &FileType:type=FileType_Unknown);
dvander@2168
   129
dvander@2168
   130
/**
dvander@2168
   131
 * Opens a file.
dvander@2168
   132
 *
dvander@2168
   133
 * @note Files are closed with CloseHandle().
dvander@2168
   134
 * @note File Handles can be cloned.
dvander@2168
   135
 * @note OpenFile() supports the "file://" notation.
dvander@2168
   136
 *
dvander@2168
   137
 * @param file			File to open.
dvander@2168
   138
 * @param mode			Open mode.
dvander@2168
   139
 * @return				A Handle to the file, INVALID_HANDLE on open error.
dvander@2168
   140
 */
dvander@2168
   141
native Handle:OpenFile(const String:file[], const String:mode[]);
dvander@2168
   142
dvander@2168
   143
/**
dvander@2168
   144
 * Deletes a file.
dvander@2168
   145
 *
dvander@2168
   146
 * @param path			Path of the file to delete.
dvander@2168
   147
 * @return				True on success, false otherwise.
dvander@2168
   148
 */
dvander@2168
   149
native bool:DeleteFile(const String:path[]);
dvander@2168
   150
dvander@2168
   151
/**
dvander@2168
   152
 * Reads a line from a text file.
dvander@2168
   153
 *
dvander@2168
   154
 * @param hndl			Handle to the file.
dvander@2168
   155
 * @param buffer		String buffer to hold the line.
dvander@2168
   156
 * @param maxlength		Maximum size of string buffer.	
dvander@2168
   157
 * @return				True on success, false otherwise.
dvander@2168
   158
 */
dvander@2168
   159
native bool:ReadFileLine(Handle:hndl, String:buffer[], maxlength);
dvander@2168
   160
dvander@2168
   161
/**
dvander@2168
   162
 * Reads binary data from a file.
dvander@2168
   163
 *
dvander@2168
   164
 * @param hndl			Handle to the file.
dvander@2168
   165
 * @param items			Array to store each item read.  
dvander@2168
   166
 * @param num_items		Number of items to read into the array.
dvander@2168
   167
 * @param size			Size of each element, in bytes, to be read.
dvander@2168
   168
 *						Valid sizes are 1, 2, or 4.
dvander@2168
   169
 * @return				Number of elements read, or -1 on error.
dvander@2168
   170
 */
dvander@2168
   171
native ReadFile(Handle:hndl, items[], num_items, size);
dvander@2168
   172
dvander@2168
   173
/**
dvander@2168
   174
 * Reads a UTF8 or ANSI string from a file.
dvander@2168
   175
 *
dvander@2168
   176
 * @param hndl			Handle to the file.
dvander@2168
   177
 * @param buffer		Buffer to store the string.
dvander@2168
   178
 * @param max_size		Maximum size of the string buffer.
dvander@2168
   179
 * @param stop			If true, reading will stop once max_size-1 bytes have 
dvander@2168
   180
 *						been read.  If false, reading will stop once a NUL 
dvander@2168
   181
 *						terminator is reached.  The buffer will simply be 
dvander@2168
   182
 *						terminated in either case, the difference is in how 
dvander@2168
   183
 *						the far the file position is changed.
dvander@2168
   184
 * @return				Number of characters written to the buffer, or -1 
dvander@2168
   185
 *						if an error was encountered.
dvander@2168
   186
 * @error				Invalid Handle, or read_count > max_size.
dvander@2168
   187
 */
dvander@2168
   188
native ReadFileString(Handle:hndl, String:buffer[], max_size, read_count=-1);
dvander@2168
   189
dvander@2168
   190
/**
dvander@2168
   191
 * Writes binary data to a file.
dvander@2168
   192
 *
dvander@2168
   193
 * @param hndl			Handle to the file.
dvander@2168
   194
 * @param items			Array of items to write.  The data is read directly. 
dvander@2168
   195
 *						That is, in 1 or 2-byte mode, the lower byte(s) in 
dvander@2168
   196
 *						each cell are used directly, rather than performing 
dvander@2168
   197
 *						any casts from a 4-byte number to a smaller number.
dvander@2168
   198
 * @param num_items		Number of items in the array.
dvander@2168
   199
 * @param size			Size of each item in the array in bytes.  
dvander@2168
   200
 *						Valid sizes are 1, 2, or 4.
dvander@2168
   201
 * @return				True on success, false on error.
dvander@2168
   202
 * @error				Invalid Handle.
dvander@2168
   203
 */
dvander@2168
   204
native bool:WriteFile(Handle:hndl, const items[], num_items, size);
dvander@2168
   205
dvander@2168
   206
/**
dvander@2168
   207
 * Writes a binary string to a file.
dvander@2168
   208
 *
dvander@2168
   209
 * @param hndl			Handle to th efile.
dvander@2168
   210
 * @param buffer		String to write.
dvander@2168
   211
 * @param term			True to append NUL terminator, false otherwise.
dvander@2168
   212
 * @return				True on success, false on error.
dvander@2168
   213
 * @error				Invalid Handle.
dvander@2168
   214
 */
dvander@2168
   215
native bool:WriteFileString(Handle:hndl, const String:buffer[], bool:term);
dvander@2168
   216
dvander@2168
   217
/**
dvander@2168
   218
 * Writes a line of text to a text file.  A newline is automatically appended.
dvander@2168
   219
 *
dvander@2168
   220
 * @param hndl			Handle to the file.
dvander@2168
   221
 * @param format		Formatting rules.
dvander@2168
   222
 * @param ...			Variable number of format parameters.
dvander@2168
   223
 * @return				True on success, false otherwise.
dvander@2168
   224
 * @error				Invalid Handle.
dvander@2168
   225
 */
dvander@2168
   226
native bool:WriteFileLine(Handle:hndl, const String:format[], any:...);
dvander@2168
   227
dvander@2168
   228
/**
dvander@2168
   229
 * Reads a single binary cell from a file.
dvander@2168
   230
 *
dvander@2168
   231
 * @param hndl			Handle to the file.
dvander@2168
   232
 * @param data			Variable to store the data read.
dvander@2168
   233
 * @param size			Size of the data to read in bytes.  Valid 
dvander@2168
   234
 *						sizes are 1, 2, or 4 bytes.
dvander@2168
   235
 * @return				Number of elements read (max 1), or -1 on error.
dvander@2168
   236
 * @error				Invalid Handle.
dvander@2168
   237
 */
dvander@2168
   238
stock ReadFileCell(Handle:hndl, &data, size)
dvander@2168
   239
{
dvander@2168
   240
	new array[1], ret;
dvander@2168
   241
	
dvander@2168
   242
	if ((ret = ReadFile(hndl, array, 1, size)) == 1)
dvander@2168
   243
	{
dvander@2168
   244
		data = array[0];
dvander@2168
   245
	}
dvander@2168
   246
	
dvander@2168
   247
	return ret;
dvander@2168
   248
}
dvander@2168
   249
dvander@2168
   250
/**
dvander@2168
   251
 * Writes a single binary cell to a file.
dvander@2168
   252
 *
dvander@2168
   253
 * @param hndl			Handle to the file.
dvander@2168
   254
 * @param data			Cell to write to the file.
dvander@2168
   255
 * @param size			Size of the data to read in bytes.  Valid 
dvander@2168
   256
 *						sizes are 1, 2, or 4 bytes.  If the size 
dvander@2168
   257
 *						is less than 4 bytes, the data is truncated 
dvander@2168
   258
 *						rather than casted.  That is, only the lower 
dvander@2168
   259
 *						bits will be read.
dvander@2168
   260
 * @return				True on success, false on error.
dvander@2168
   261
 * @error				Invalid Handle.
dvander@2168
   262
 */
dvander@2168
   263
stock bool:WriteFileCell(Handle:hndl, data, size)
dvander@2168
   264
{
dvander@2168
   265
	new array[1];
dvander@2168
   266
	
dvander@2168
   267
	array[0] = data;
dvander@2168
   268
	
dvander@2168
   269
	return WriteFile(hndl, array, 1, size);
dvander@2168
   270
}
dvander@2168
   271
 
dvander@2168
   272
/**
dvander@2168
   273
 * Tests if the end of file has been reached.
dvander@2168
   274
 *
dvander@2168
   275
 * @param file			Handle to the file.
dvander@2168
   276
 * @return				True if end of file has been reached, false otherwise.
dvander@2168
   277
 * @error				Invalid Handle.
dvander@2168
   278
 */
dvander@2168
   279
native bool:IsEndOfFile(Handle:file);
dvander@2168
   280
dvander@2168
   281
/**
dvander@2168
   282
 * Sets the file position indicator.
dvander@2168
   283
 *
dvander@2168
   284
 * @param file			Handle to the file.
dvander@2168
   285
 * @param position		Position relative to what is specified in whence.
dvander@2168
   286
 * @param where			SEEK_ constant value of where to see from.
dvander@2168
   287
 * @return				True on success, false otherwise.
dvander@2168
   288
 * @error				Invalid Handle.
dvander@2168
   289
 */
dvander@2168
   290
native bool:FileSeek(Handle:file, position, where);
dvander@2168
   291
dvander@2168
   292
/**
dvander@2168
   293
 * Get current position in the file.
dvander@2168
   294
 *
dvander@2168
   295
 * @param file			Handle to the file.
dvander@2168
   296
 * @return				Value for the file position indicator.
dvander@2168
   297
 * @error				Invalid Handle.
dvander@2168
   298
 */
dvander@2168
   299
native FilePosition(Handle:file);
dvander@2168
   300
dvander@2168
   301
/**
dvander@2168
   302
 * Checks if a file exists.
dvander@2168
   303
 *
dvander@2168
   304
 * @param path			Path to the file.
dvander@2168
   305
 * @param use_valve_fs	If true, the Valve file system will be used instead.
dvander@2168
   306
 *						This can be used to check for the existance of files 
dvander@2168
   307
 *						inside GCFs or the game cache, rather than solely files 
dvander@2168
   308
 *						that are on disk.
dvander@2168
   309
 * @return				True if the file exists, false otherwise.
dvander@2168
   310
 */
dvander@2168
   311
native bool:FileExists(const String:path[], bool:use_valve_fs=false);
dvander@2168
   312
dvander@2168
   313
/**
dvander@2168
   314
 * Renames a file.
dvander@2168
   315
 *
dvander@2168
   316
 * @param newpath		New path to the file.
dvander@2168
   317
 * @param oldpath		Path to the existing file.
dvander@2168
   318
 * @return				True on success, false otherwise.
dvander@2168
   319
 */
dvander@2168
   320
native bool:RenameFile(const String:newpath[], const String:oldpath[]);
dvander@2168
   321
dvander@2168
   322
/**
dvander@2168
   323
 * Checks if a directory exists.
dvander@2168
   324
 *
dvander@2168
   325
 * @param path			Path to the directory.
dvander@2168
   326
 * @return				True if the directory exists, false otherwise.
dvander@2168
   327
 */
dvander@2168
   328
native bool:DirExists(const String:path[]);
dvander@2168
   329
dvander@2168
   330
/**
dvander@2168
   331
 * Get the file size in bytes.
dvander@2168
   332
 *
dvander@2168
   333
 * @param path			Path to the file.
dvander@2168
   334
 * @return				File size in bytes, -1 if file not found.
dvander@2168
   335
 */
dvander@2168
   336
native FileSize(const String:path[]);
dvander@2168
   337
dvander@2168
   338
/**
dvander@2168
   339
 * Flushes a file's buffered output; any buffered output
dvander@2168
   340
 * is immediately written to the file.
dvander@2168
   341
 *
dvander@2168
   342
 * @param file			Handle to the file.
dvander@2168
   343
 * @return				True on success, false on failure.
dvander@2168
   344
 */
dvander@2168
   345
native FlushFile(Handle:file);
dvander@2168
   346
dvander@2168
   347
/**
dvander@2168
   348
 * Removes a directory.
dvander@2168
   349
 * @note On most Operating Systems you cannot remove a directory which has files inside it.
dvander@2168
   350
 *
dvander@2168
   351
 * @param path			Path to the directory.
dvander@2168
   352
 * @return				True on success, false otherwise.
dvander@2168
   353
 */
dvander@2168
   354
native bool:RemoveDir(const String:path[]);
dvander@2168
   355
dvander@2168
   356
/**
dvander@2168
   357
 * Returns a file timestamp as a unix timestamp.
dvander@2168
   358
 *
dvander@2168
   359
 * @param file			File name.
dvander@2168
   360
 * @param tmode			Time mode.
dvander@2168
   361
 * @return				Time value, or -1 on failure.
dvander@2168
   362
 */
dvander@2168
   363
native GetFileTime(const String:file[], FileTimeMode:tmode);
dvander@2168
   364
dvander@2168
   365
/**
dvander@2168
   366
 * Same as LogToFile(), except uses an open file Handle.  The file must 
dvander@2168
   367
 * be opened in text appending mode.
dvander@2168
   368
 *
dvander@2168
   369
 * @param hndl			Handle to the file.
dvander@2168
   370
 * @param message		Message format.
dvander@2168
   371
 * @param ...			Message format parameters.
dvander@2168
   372
 * @noreturn
dvander@2168
   373
 * @error				Invalid Handle.
dvander@2168
   374
 */
dvander@2168
   375
native LogToOpenFile(Handle:hndl, const String:message[], any:...);
dvander@2168
   376
dvander@2168
   377
/**
dvander@2168
   378
 * Same as LogToFileEx(), except uses an open file Handle.  The file must 
dvander@2168
   379
 * be opened in text appending mode.
dvander@2168
   380
 *
dvander@2168
   381
 * @param hndl			Handle to the file.
dvander@2168
   382
 * @param message		Message format.
dvander@2168
   383
 * @param ...			Message format parameters.
dvander@2168
   384
 * @noreturn
dvander@2168
   385
 * @error				Invalid Handle.
dvander@2168
   386
 */
dvander@2168
   387
native LogToOpenFileEx(Handle:hndl, const String:message[], any:...);
dvander@2168
   388