2 // Mono.Posix/PosixFileInfo.cs
5 // Jonathan Pryor (jonpryor@vt.edu)
7 // (C) 2004 Jonathan Pryor
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 namespace Mono
.Posix
{
36 public class PosixFileInfo
: PosixFileSystemInfo
38 public PosixFileInfo (string path
)
43 internal PosixFileInfo (string path
, Stat stat
)
48 public override void Delete ()
50 int r
= Syscall
.unlink (Path
);
51 PosixMarshal
.ThrowExceptionForLastErrorIf (r
);
55 public PosixStream
Create ()
57 FilePermissions mode
= // 0644
58 FilePermissions
.S_IRUSR
| FilePermissions
.S_IWUSR
|
59 FilePermissions
.S_IRGRP
| FilePermissions
.S_IROTH
;
63 public PosixStream
Create (FilePermissions mode
)
65 int fd
= Syscall
.creat (Path
, mode
);
67 PosixMarshal
.ThrowExceptionForLastError ();
69 return new PosixStream (fd
);
72 public PosixStream
Open (OpenFlags flags
)
74 int fd
= Syscall
.open (Path
, flags
);
76 PosixMarshal
.ThrowExceptionForLastError ();
77 return new PosixStream (fd
);
80 public PosixStream
Open (OpenFlags flags
, FilePermissions mode
)
82 int fd
= Syscall
.open (Path
, flags
, mode
);
84 PosixMarshal
.ThrowExceptionForLastError ();
85 return new PosixStream (fd
);
88 public PosixStream
Open (FileMode mode
)
90 OpenFlags flags
= ToOpenFlags (mode
, FileAccess
.ReadWrite
);
91 int fd
= Syscall
.open (Path
, flags
);
93 PosixMarshal
.ThrowExceptionForLastError ();
94 return new PosixStream (fd
);
97 public PosixStream
Open (FileMode mode
, FileAccess access
)
99 OpenFlags flags
= ToOpenFlags (mode
, access
);
100 int fd
= Syscall
.open (Path
, flags
);
102 PosixMarshal
.ThrowExceptionForLastError ();
103 return new PosixStream (fd
);
106 public PosixStream
Open (FileMode mode
, FileAccess access
, FilePermissions perms
)
108 OpenFlags flags
= ToOpenFlags (mode
, access
);
109 int fd
= Syscall
.open (Path
, flags
, perms
);
111 PosixMarshal
.ThrowExceptionForLastError ();
112 return new PosixStream (fd
);
115 public PosixStream
OpenRead ()
117 return Open (FileMode
.Open
, FileAccess
.Read
);
120 public PosixStream
OpenWrite ()
122 return Open (FileMode
.OpenOrCreate
, FileAccess
.Write
);
125 public static OpenFlags
ToOpenFlags (FileMode mode
, FileAccess access
)
129 case FileMode
.CreateNew
:
130 flags
= OpenFlags
.O_CREAT
| OpenFlags
.O_EXCL
;
132 case FileMode
.Create
:
133 flags
= OpenFlags
.O_CREAT
| OpenFlags
.O_TRUNC
;
138 case FileMode
.OpenOrCreate
:
139 flags
= OpenFlags
.O_CREAT
;
141 case FileMode
.Truncate
:
142 flags
= OpenFlags
.O_TRUNC
;
144 case FileMode
.Append
:
145 flags
= OpenFlags
.O_APPEND
;
148 throw new ArgumentOutOfRangeException ("mode", mode
,
149 Locale
.GetText ("Unsupported mode value"));
153 if (PosixConvert
.TryFromOpenFlags (OpenFlags
.O_LARGEFILE
, out _ignored
))
154 flags
|= OpenFlags
.O_LARGEFILE
;
157 case FileAccess
.Read
:
158 flags
|= OpenFlags
.O_RDONLY
;
160 case FileAccess
.Write
:
161 flags
|= OpenFlags
.O_WRONLY
;
163 case FileAccess
.ReadWrite
:
164 flags
|= OpenFlags
.O_RDWR
;
167 throw new ArgumentOutOfRangeException ("access", access
,
168 Locale
.GetText ("Unsupported access value"));