3 * File IO internal calls
6 * Dick Porter (dick@ximian.com)
7 * Dan Lewis (dihlewis@yahoo.co.uk)
9 * (C) 2001 Ximian, Inc.
10 * Copyright 2012 Xamarin Inc (http://www.xamarin.com)
11 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
14 #ifndef _MONO_METADATA_W32FILE_H_
15 #define _MONO_METADATA_W32FILE_H_
20 #include <mono/metadata/object-internals.h>
21 #include <mono/utils/mono-compiler.h>
22 #include <mono/metadata/icalls.h>
24 /* This is a copy of System.IO.FileAccess */
27 FileAccess_Write
=0x02,
28 FileAccess_ReadWrite
=FileAccess_Read
|FileAccess_Write
31 /* This is a copy of System.IO.FileMode */
36 FileMode_OpenOrCreate
=4,
41 /* This is a copy of System.IO.FileShare */
46 FileShare_ReadWrite
=FileShare_Read
|FileShare_Write
,
50 /* This is a copy of System.IO.FileOptions */
53 FileOptions_Temporary
= 1, // Internal. See note in System.IO.FileOptions
54 FileOptions_Encrypted
= 0x4000,
55 FileOptions_DeleteOnClose
= 0x4000000,
56 FileOptions_SequentialScan
= 0x8000000,
57 FileOptions_RandomAccess
= 0x10000000,
58 FileOptions_Asynchronous
= 0x40000000,
59 FileOptions_WriteThrough
= 0x80000000
62 /* This is a copy of System.IO.SeekOrigin */
69 /* This is a copy of System.IO.MonoIOStat */
70 typedef struct _MonoIOStat
{
74 gint64 last_access_time
;
75 gint64 last_write_time
;
78 /* This is a copy of System.IO.FileAttributes */
80 FileAttributes_ReadOnly
=0x00001,
81 FileAttributes_Hidden
=0x00002,
82 FileAttributes_System
=0x00004,
83 FileAttributes_Directory
=0x00010,
84 FileAttributes_Archive
=0x00020,
85 FileAttributes_Device
=0x00040,
86 FileAttributes_Normal
=0x00080,
87 FileAttributes_Temporary
=0x00100,
88 FileAttributes_SparseFile
=0x00200,
89 FileAttributes_ReparsePoint
=0x00400,
90 FileAttributes_Compressed
=0x00800,
91 FileAttributes_Offline
=0x01000,
92 FileAttributes_NotContentIndexed
=0x02000,
93 FileAttributes_Encrypted
=0x04000,
94 FileAttributes_MonoExecutable
= (int) 0x80000000
96 /* This is not used anymore
97 typedef struct _MonoFSAsyncResult {
100 MonoBoolean completed;
103 MonoWaitHandle *wait_handle;
104 MonoDelegate *async_callback;
105 MonoBoolean completed_synch;
111 MonoDelegate *real_cb;
114 /* System.IO.MonoIO */
120 ves_icall_System_IO_MonoIO_CreateDirectory (const gunichar2
*path
, gint32
*error
);
124 ves_icall_System_IO_MonoIO_RemoveDirectory (const gunichar2
*path
, gint32
*error
);
128 ves_icall_System_IO_MonoIO_FindCloseFile (gpointer hnd
);
132 ves_icall_System_IO_MonoIO_SetCurrentDirectory (const gunichar2
*path
,
136 ves_icall_System_IO_MonoIO_MoveFile (const gunichar2
*path
, const gunichar2
*dest
,
140 ves_icall_System_IO_MonoIO_CopyFile (const gunichar2
*path
, const gunichar2
*dest
,
141 MonoBoolean overwrite
, gint32
*error
);
144 ves_icall_System_IO_MonoIO_DeleteFile (const gunichar2
*path
, gint32
*error
);
148 ves_icall_System_IO_MonoIO_GetFileAttributes (const gunichar2
*path
, gint32
*error
);
152 ves_icall_System_IO_MonoIO_SetFileAttributes (const gunichar2
*path
, gint32 attrs
,
156 ves_icall_System_IO_MonoIO_GetFileType (gpointer handle
, gint32
*error
);
160 ves_icall_System_IO_MonoIO_GetFileStat (const gunichar2
*path
, MonoIOStat
*stat
,
164 ves_icall_System_IO_MonoIO_Open (const gunichar2
*filename
, gint32 mode
,
165 gint32 access_mode
, gint32 share
, gint32 options
,
169 ves_icall_System_IO_MonoIO_Close (gpointer handle
, gint32
*error
);
173 ves_icall_System_IO_MonoIO_Seek (gpointer handle
, gint64 offset
, gint32 origin
,
177 ves_icall_System_IO_MonoIO_Flush (gpointer handle
, gint32
*error
);
181 ves_icall_System_IO_MonoIO_GetLength (gpointer handle
, gint32
*error
);
185 ves_icall_System_IO_MonoIO_SetLength (gpointer handle
, gint64 length
,
189 ves_icall_System_IO_MonoIO_SetFileTime (gpointer handle
, gint64 creation_time
,
190 gint64 last_access_time
,
191 gint64 last_write_time
, gint32
*error
);
194 ves_icall_System_IO_MonoIO_get_ConsoleOutput (void);
198 ves_icall_System_IO_MonoIO_get_ConsoleInput (void);
202 ves_icall_System_IO_MonoIO_get_ConsoleError (void);
206 ves_icall_System_IO_MonoIO_CreatePipe (gpointer
*read_handle
, gpointer
*write_handle
, gint32
*error
);
210 ves_icall_System_IO_MonoIO_DuplicateHandle (gpointer source_process_handle
, gpointer source_handle
,
211 gpointer target_process_handle
, gpointer
*target_handle
, gint32 access
, gint32 inherit
, gint32 options
, gint32
*error
);
215 ves_icall_System_IO_MonoIO_get_VolumeSeparatorChar (void);
219 ves_icall_System_IO_MonoIO_get_DirectorySeparatorChar (void);
223 ves_icall_System_IO_MonoIO_get_AltDirectorySeparatorChar (void);
227 ves_icall_System_IO_MonoIO_get_PathSeparator (void);
230 void ves_icall_System_IO_MonoIO_Lock (gpointer handle
, gint64 position
,
231 gint64 length
, gint32
*error
);
234 void ves_icall_System_IO_MonoIO_Unlock (gpointer handle
, gint64 position
,
235 gint64 length
, gint32
*error
);
238 ves_icall_System_IO_MonoIO_ReplaceFile (const gunichar2
*source_file_name
, const gunichar2
*destination_file_name
,
239 const gunichar2
*destination_backup_file_name
, MonoBoolean ignore_metadata_errors
,
244 ves_icall_System_IO_MonoIO_DumpHandles (void);
246 #endif /* !ENABLE_NETCORE */
248 #if defined (TARGET_IOS) || defined (TARGET_ANDROID)
250 MONO_API MONO_RT_EXTERNAL_ONLY gint64
251 mono_filesize_from_path (MonoString
*path
);
254 mono_filesize_from_fd (int fd
);
258 #if !defined(HOST_WIN32)
260 #define GENERIC_READ 0x80000000
261 #define GENERIC_WRITE 0x40000000
262 #define GENERIC_EXECUTE 0x20000000
263 #define GENERIC_ALL 0x10000000
265 #define FILE_SHARE_READ 0x00000001
266 #define FILE_SHARE_WRITE 0x00000002
267 #define FILE_SHARE_DELETE 0x00000004
270 #define CREATE_ALWAYS 2
271 #define OPEN_EXISTING 3
272 #define OPEN_ALWAYS 4
273 #define TRUNCATE_EXISTING 5
275 #define FILE_ATTRIBUTE_READONLY 0x00000001
276 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
277 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
278 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
279 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
280 #define FILE_ATTRIBUTE_ENCRYPTED 0x00000040
281 #define FILE_ATTRIBUTE_NORMAL 0x00000080
282 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
283 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
284 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
285 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
286 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
287 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
288 #define FILE_FLAG_OPEN_NO_RECALL 0x00100000
289 #define FILE_FLAG_OPEN_REPARSE_POINT 0x00200000
290 #define FILE_FLAG_POSIX_SEMANTICS 0x01000000
291 #define FILE_FLAG_BACKUP_SEMANTICS 0x02000000
292 #define FILE_FLAG_DELETE_ON_CLOSE 0x04000000
293 #define FILE_FLAG_SEQUENTIAL_SCAN 0x08000000
294 #define FILE_FLAG_RANDOM_ACCESS 0x10000000
295 #define FILE_FLAG_NO_BUFFERING 0x20000000
296 #define FILE_FLAG_OVERLAPPED 0x40000000
297 #define FILE_FLAG_WRITE_THROUGH 0x80000000
299 #define REPLACEFILE_WRITE_THROUGH 0x00000001
300 #define REPLACEFILE_IGNORE_MERGE_ERRORS 0x00000002
304 #define INVALID_SET_FILE_POINTER ((guint32) 0xFFFFFFFF)
305 #define INVALID_FILE_SIZE ((guint32) 0xFFFFFFFF)
306 #define INVALID_FILE_ATTRIBUTES ((guint32) 0xFFFFFFFF)
308 #define FILE_TYPE_UNKNOWN 0x0000
309 #define FILE_TYPE_DISK 0x0001
310 #define FILE_TYPE_CHAR 0x0002
311 #define FILE_TYPE_PIPE 0x0003
312 #define FILE_TYPE_REMOTE 0x8000
315 #define FILE_CURRENT 1
318 #define DRIVE_UNKNOWN 0
319 #define DRIVE_NO_ROOT_DIR 1
320 #define DRIVE_REMOVABLE 2
321 #define DRIVE_FIXED 3
322 #define DRIVE_REMOTE 4
323 #define DRIVE_CDROM 5
324 #define DRIVE_RAMDISK 6
334 guint16 wMilliseconds
;
338 #if G_BYTE_ORDER == G_BIG_ENDIAN
339 guint32 dwHighDateTime
;
340 guint32 dwLowDateTime
;
342 guint32 dwLowDateTime
;
343 guint32 dwHighDateTime
;
348 guint32 dwFileAttributes
;
349 FILETIME ftCreationTime
;
350 FILETIME ftLastAccessTime
;
351 FILETIME ftLastWriteTime
;
352 guint32 nFileSizeHigh
;
353 guint32 nFileSizeLow
;
356 gunichar2 cFileName
[MAX_PATH
];
357 gunichar2 cAlternateFileName
[14];
360 #endif /* !defined(HOST_WIN32) */
363 mono_w32file_init (void);
366 mono_w32file_cleanup (void);
369 mono_w32file_create(const gunichar2
*name
, guint32 fileaccess
, guint32 sharemode
, guint32 createmode
, guint32 attrs
);
372 mono_w32file_close (gpointer handle
);
375 mono_w32file_delete (const gunichar2
*name
);
378 mono_w32file_read (gpointer handle
, gpointer buffer
, guint32 numbytes
, guint32
*bytesread
, gint32
*win32error
);
381 mono_w32file_write (gpointer handle
, gconstpointer buffer
, guint32 numbytes
, guint32
*byteswritten
, gint32
*win32error
);
384 mono_w32file_flush (gpointer handle
);
387 mono_w32file_truncate (gpointer handle
);
390 mono_w32file_seek (gpointer handle
, gint32 movedistance
, gint32
*highmovedistance
, guint32 method
);
393 mono_w32file_move (const gunichar2
*path
, const gunichar2
*dest
, gint32
*error
);
396 mono_w32file_copy (const gunichar2
*path
, const gunichar2
*dest
, gboolean overwrite
, gint32
*error
);
399 mono_w32file_lock (gpointer handle
, gint64 position
, gint64 length
, gint32
*error
);
402 mono_w32file_replace (const gunichar2
*destination_file_name
, const gunichar2
*source_file_name
, const gunichar2
*destination_backup_file_name
, guint32 flags
, gint32
*error
);
405 mono_w32file_unlock (gpointer handle
, gint64 position
, gint64 length
, gint32
*error
);
408 mono_w32file_get_console_output (void);
411 mono_w32file_get_console_error (void);
414 mono_w32file_get_console_input (void);
417 mono_w32file_get_file_size (gpointer handle
, gint32
*error
);
420 mono_w32file_get_type (gpointer handle
);
423 mono_w32file_set_times (gpointer handle
, const FILETIME
*create_time
, const FILETIME
*access_time
, const FILETIME
*write_time
);
426 mono_w32file_filetime_to_systemtime (const FILETIME
*file_time
, SYSTEMTIME
*system_time
);
429 mono_w32file_find_first (const gunichar2
*pattern
, WIN32_FIND_DATA
*find_data
);
432 mono_w32file_find_next (gpointer handle
, WIN32_FIND_DATA
*find_data
);
435 mono_w32file_find_close (gpointer handle
);
438 mono_w32file_create_directory (const gunichar2
*name
);
441 mono_w32file_remove_directory (const gunichar2
*name
);
444 mono_w32file_get_attributes (const gunichar2
*name
);
447 mono_w32file_get_attributes_ex (const gunichar2
*name
, MonoIOStat
*stat
);
450 mono_w32file_set_attributes (const gunichar2
*name
, guint32 attrs
);
453 mono_w32file_get_cwd (guint32 length
, gunichar2
*buffer
);
456 mono_w32file_set_cwd (const gunichar2
*path
);
459 mono_w32file_create_pipe (gpointer
*readpipe
, gpointer
*writepipe
, guint32 size
);
462 mono_w32file_get_logical_drive (guint32 len
, gunichar2
*buf
);
464 #ifndef PLATFORM_NO_DRIVEINFO
466 mono_w32file_get_disk_free_space (const gunichar2
*path_name
, guint64
*free_bytes_avail
, guint64
*total_number_of_bytes
, guint64
*total_number_of_free_bytes
);
467 #endif // PLATFORM_NO_DRIVEINFO
470 mono_w32file_get_file_system_type (const gunichar2
*path
, gunichar2
*fsbuffer
, gint fsbuffersize
);
472 #endif /* _MONO_METADATA_W32FILE_H_ */