* FileSystemInfo.cs: Added InternalRefresh, a virtual method that derived
[mono.git] / mcs / class / corlib / System.IO / FileInfo.cs
1 //------------------------------------------------------------------------------\r
2 // \r
3 // System.IO.FileInfo.cs \r
4 //\r
5 // Copyright (C) 2001 Moonlight Enterprises, All Rights Reserved\r
6 // \r
7 // Author:         Jim Richardson, develop@wtfo-guru.com\r
8 //                 Dan Lewis (dihlewis@yahoo.co.uk)\r
9 // Created:        Monday, August 13, 2001 \r
10 //\r
11 //------------------------------------------------------------------------------\r
12 \r
13 using System;\r
14 \r
15 namespace System.IO {\r
16 \r
17         [Serializable]
18         public sealed class FileInfo : FileSystemInfo {\r
19         \r
20
21                 private bool exists;
22
23                 public FileInfo (string path) {\r
24                         CheckPath (path);\r
25                 \r
26                         OriginalPath = path;\r
27                         FullPath = Path.GetFullPath (path);
28                 }\r
29                 \r
30                 internal override void InternalRefresh ()\r
31                 {\r
32                         exists = File.Exists (FullPath);\r
33                 }\r
34 \r
35 \r
36                 // public properties\r
37 \r
38                 public override bool Exists {\r
39                         get {\r
40                                 Refresh (false);\r
41 \r
42                                 if (stat.Attributes == MonoIO.InvalidFileAttributes)\r
43                                         return false;\r
44 \r
45                                 if ((stat.Attributes & FileAttributes.Directory) != 0)\r
46                                         return false;\r
47 \r
48                                 return exists;
49                         }\r
50                 }\r
51 \r
52                 public override string Name {\r
53                         get {\r
54                                 return Path.GetFileName (FullPath);\r
55                         }\r
56                 }\r
57 \r
58                 public long Length {\r
59                         get {\r
60                                 if (!Exists)\r
61                                         throw new FileNotFoundException ("Could not find file \"" + OriginalPath + "\".");\r
62 \r
63                                 return stat.Length;\r
64                         }\r
65                 }\r
66 \r
67                 public string DirectoryName {\r
68                         get {\r
69                                 return Path.GetDirectoryName (FullPath);\r
70                         }\r
71                 }\r
72 \r
73                 public DirectoryInfo Directory {\r
74                         get {\r
75                                 return new DirectoryInfo (DirectoryName);\r
76                         }\r
77                 }\r
78 \r
79                 // streamreader methods\r
80 \r
81                 public StreamReader OpenText () {\r
82                         return new StreamReader (Open (FileMode.Open, FileAccess.Read));\r
83                 }\r
84 \r
85                 public StreamWriter CreateText () {\r
86                         return new StreamWriter (Open (FileMode.Create, FileAccess.Write));\r
87                 }\r
88                 \r
89                 public StreamWriter AppendText () {\r
90                         return new StreamWriter (Open (FileMode.Append, FileAccess.Write));\r
91                 }\r
92 \r
93                 // filestream methods\r
94
95                 public FileStream Create ()
96                 {
97                         return File.Create (FullPath);
98                 }
99                 
100                 \r
101                 public FileStream OpenRead () {\r
102                         return Open (FileMode.Open, FileAccess.Read);\r
103                 }\r
104 \r
105                 public FileStream OpenWrite () {\r
106                         return Open (FileMode.OpenOrCreate, FileAccess.Write);\r
107                 }\r
108 \r
109                 public FileStream Open (FileMode mode) {\r
110                         return Open (mode, FileAccess.ReadWrite);\r
111                 }\r
112 \r
113                 public FileStream Open (FileMode mode, FileAccess access) {\r
114                         return Open (mode, access, FileShare.None);\r
115                 }\r
116 \r
117                 public FileStream Open (FileMode mode, FileAccess access, FileShare share) {\r
118                         return new FileStream (FullPath, mode, access, share);\r
119                 }\r
120 \r
121                 // file methods\r
122
123                 public override void Delete () {
124                         MonoIOError error;
125                                                 
126                         if (!MonoIO.Exists (FullPath, out error)) {
127                                 // a weird MS.NET behaviour
128                                 return;
129                         }
130
131                         if (MonoIO.ExistsDirectory (FullPath, out error)) {
132                                 throw new UnauthorizedAccessException ("Access to the path \"" + FullPath + "\" is denied.");
133                         }
134                         
135                         if (!MonoIO.DeleteFile (FullPath, out error)) {
136                                 throw MonoIO.GetException (OriginalPath,
137                                                            error);
138                         }
139                 }
140                 
141                 public void MoveTo (string dest) {
142                         if (dest == null)
143                                 throw new ArgumentNullException ();
144                         MonoIOError error;
145                         if (MonoIO.Exists (dest, out error) ||
146                                 MonoIO.ExistsDirectory (dest, out error))
147                                 throw new IOException ();
148                         File.Move (FullPath, dest);
149                         this.FullPath = Path.GetFullPath (dest);
150                 }
151
152                 public FileInfo CopyTo (string path) {\r
153                         return CopyTo (path, false);\r
154                 }\r
155 \r
156                 public FileInfo CopyTo (string path, bool overwrite) {\r
157                         string dest = Path.GetFullPath (path);\r
158
159                         if (overwrite && File.Exists (path))
160                                 File.Delete (path);
161
162                         File.Copy (FullPath, dest);\r
163                 \r
164                         return new FileInfo (dest);\r
165                 }\r
166 \r
167                 public override string ToString () {\r
168                         return OriginalPath;\r
169                 }\r
170         }\r
171 }\r