public static int readdir_r (IntPtr dirp, Dirent entry, out IntPtr result) { entry.d_ino = 0; entry.d_off = 0; entry.d_reclen = 0; entry.d_type = 0; entry.d_name = null; _Dirent _d; int r = sys_readdir_r (dirp, out _d, out result); if (r == 0 && result != IntPtr.Zero) { CopyDirent (entry, ref _d); } return r; }
public static Dirent readdir (IntPtr dir) { _Dirent dentry; int r = sys_readdir (dir, out dentry); if (r != 0) return null; Dirent d = new Dirent (); CopyDirent (d, ref dentry); return d; }
private UnixFileSystemInfo[] GetFileSystemEntries (Dirent[] dentries) { UnixFileSystemInfo[] entries = new UnixFileSystemInfo[dentries.Length]; for (int i = 0; i != entries.Length; ++i) entries [i] = UnixFileSystemInfo.Create (dentries[i].d_name); return entries; }
private static void CopyDirent (Dirent to, ref _Dirent from) { try { to.d_ino = from.d_ino; to.d_off = from.d_off; to.d_reclen = from.d_reclen; to.d_type = from.d_type; to.d_name = UnixMarshal.PtrToString (from.d_name); } finally { Stdlib.free (from.d_name); from.d_name = IntPtr.Zero; } }
private static Dirent[] GetEntries (IntPtr dirp, Regex regex) { ArrayList entries = new ArrayList (); int r; IntPtr result; do { Dirent d = new Dirent (); r = Syscall.readdir_r (dirp, d, out result); if (r == 0 && result != IntPtr.Zero && regex.Match (d.d_name).Success) { // don't include current & parent dirs if (d.d_name != "." && d.d_name != "..") entries.Add (d); } } while (r == 0 && result != IntPtr.Zero); if (r != 0) UnixMarshal.ThrowExceptionForLastError (); return (Dirent[]) entries.ToArray (typeof(Dirent)); }