using System.Security.Permissions;
using System.Text;
using System.Runtime.InteropServices;
-
-#if !MOONLIGHT
using System.Security.AccessControl;
-#endif
namespace System.IO
{
return CreateDirectoriesInternal (path);
}
-#if !MOONLIGHT
[MonoLimitation ("DirectorySecurity not implemented")]
public static DirectoryInfo CreateDirectory (string path, DirectorySecurity directorySecurity)
{
return(CreateDirectory (path));
}
-#endif
static DirectoryInfo CreateDirectoriesInternal (string path)
{
if (!success) {
/*
* FIXME:
- * In io-layer/io.c rmdir returns error_file_not_found if directory does not exists.
+ * In io-layer/io.c rmdir returns error_file_not_found if directory does not exist.
* So maybe this could be handled somewhere else?
*/
if (error == MonoIOError.ERROR_FILE_NOT_FOUND) {
{
SecurityManager.EnsureElevatedPermissions (); // this is a no-op outside moonlight
- string result = InsecureGetCurrentDirectory();
+ string result = InsecureGetCurrentDirectory();
#if !NET_2_1
if ((result != null) && (result.Length > 0) && SecurityManager.SecurityEnabled) {
new FileIOPermission (FileIOPermissionAccess.PathDiscovery, result).Demand ();
return result;
}
- internal static string InsecureGetCurrentDirectory ()
- {
- MonoIOError error;
- string result = MonoIO.GetCurrentDirectory(out error);
-
- if (error != MonoIOError.ERROR_SUCCESS)
- throw MonoIO.GetException(error);
+ internal static string InsecureGetCurrentDirectory()
+ {
+ MonoIOError error;
+ string result = MonoIO.GetCurrentDirectory(out error);
+
+ if (error != MonoIOError.ERROR_SUCCESS)
+ throw MonoIO.GetException(error);
- return result;
- }
+ return result;
+ }
public static string [] GetDirectories (string path)
{
return GetFileSystemEntries (path, searchPattern, FileAttributes.Directory, FileAttributes.Directory);
}
-#if !MOONLIGHT
public static string [] GetDirectories (string path, string searchPattern, SearchOption searchOption)
{
if (searchOption == SearchOption.TopDirectoryOnly)
foreach (string dir in GetDirectories (path))
GetDirectoriesRecurse (dir, searchPattern, all);
}
-#endif
public static string GetDirectoryRoot (string path)
{
return GetFileSystemEntries (path, searchPattern, FileAttributes.Directory, 0);
}
-#if !MOONLIGHT
public static string[] GetFiles (string path, string searchPattern, SearchOption searchOption)
{
if (searchOption == SearchOption.TopDirectoryOnly)
foreach (string dir in GetDirectories (path))
GetFilesRecurse (dir, searchPattern, all);
}
-#endif
public static string [] GetFileSystemEntries (string path)
{
throw MonoIO.GetException (error);
}
-#if !MOONLIGHT
public static void SetAccessControl (string path, DirectorySecurity directorySecurity)
{
if (null == directorySecurity)
directorySecurity.PersistModifications (path);
}
-#endif
public static void SetCreationTime (string path, DateTime creationTime)
{
return result;
}
-#if NET_4_0 || MOONLIGHT || MOBILE
+#if NET_4_0
public static string[] GetFileSystemEntries (string path, string searchPattern, SearchOption searchOption)
{
// Take the simple way home:
yield return path_with_pattern;
yield break;
}
-
+
IntPtr handle;
MonoIOError error;
FileAttributes rattr;
- bool subdirs = searchOption == SearchOption.AllDirectories;
-
string s = MonoIO.FindFirst (path, path_with_pattern, out rattr, out error, out handle);
- if (s == null)
- yield break;
- if (error != 0)
- throw MonoIO.GetException (Path.GetDirectoryName (Path.Combine (path, searchPattern)), (MonoIOError) error);
-
try {
- //
- // Convert any file specific flag to FileAttributes.Normal which is used as include files flag
- //
- if (((rattr & FileAttributes.Directory) == 0) && rattr != 0)
- rattr |= FileAttributes.Normal;
-
- bool first = true;
- if (((rattr & FileAttributes.ReparsePoint) == 0) && ((rattr & kind) != 0))
- yield return s;
-
- do {
- if (((rattr & FileAttributes.Directory) != 0) && subdirs) {
- foreach (string child in EnumerateKind (s, searchPattern, searchOption, kind))
- yield return child;
- }
-
- if (first) {
- first = false;
- continue;
- }
-
- if ((rattr & FileAttributes.ReparsePoint) != 0)
- continue;
+ while (s != null) {
+ // Convert any file specific flag to FileAttributes.Normal which is used as include files flag
+ if (((rattr & FileAttributes.Directory) == 0) && rattr != 0)
+ rattr |= FileAttributes.Normal;
if ((rattr & kind) != 0)
yield return s;
- } while ((s = MonoIO.FindNext (handle, out rattr, out error)) != null);
+
+ s = MonoIO.FindNext (handle, out rattr, out error);
+ }
+
+ if (error != 0)
+ throw MonoIO.GetException (Path.GetDirectoryName (Path.Combine (path, searchPattern)), (MonoIOError) error);
} finally {
- MonoIO.FindClose (handle);
+ if (handle != IntPtr.Zero)
+ MonoIO.FindClose (handle);
+ }
+
+ if (searchOption == SearchOption.AllDirectories) {
+ s = MonoIO.FindFirst (path, Path.Combine (path, "*"), out rattr, out error, out handle);
+
+ try {
+ while (s != null) {
+ if ((rattr & FileAttributes.Directory) != 0 && (rattr & FileAttributes.ReparsePoint) == 0)
+ foreach (string child in EnumerateKind (s, searchPattern, searchOption, kind))
+ yield return child;
+ s = MonoIO.FindNext (handle, out rattr, out error);
+ }
+
+ if (error != 0)
+ throw MonoIO.GetException (path, (MonoIOError) error);
+ } finally {
+ if (handle != IntPtr.Zero)
+ MonoIO.FindClose (handle);
+ }
}
}
#endif
-#if !MOONLIGHT
public static DirectorySecurity GetAccessControl (string path, AccessControlSections includeSections)
{
return new DirectorySecurity (path, includeSections);
AccessControlSections.Group |
AccessControlSections.Access);
}
-#endif
}
}