mirror of
https://github.com/ReneLergner/WPinternals.git
synced 2026-08-09 17:41:13 +10:00
Project: Add SDK
This commit is contained in:
@@ -0,0 +1,159 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace WPinternalsSDK
|
||||
{
|
||||
public class Folder : FileSystemEntry
|
||||
{
|
||||
internal Folder(string Path, FileAttributes Attributes) : base(Path, Attributes | FileAttributes.Directory)
|
||||
{
|
||||
}
|
||||
|
||||
internal Folder(string Path) : base(Path, FileAttributes.Directory)
|
||||
{
|
||||
}
|
||||
|
||||
public Folder() : base("", FileAttributes.Directory)
|
||||
{
|
||||
}
|
||||
|
||||
public List<FileSystemEntry> GetSubItems()
|
||||
{
|
||||
this.QueryFolder();
|
||||
return this.SubItems;
|
||||
}
|
||||
|
||||
private void QueryFolder()
|
||||
{
|
||||
object obj = this.queryLockObject;
|
||||
lock (obj)
|
||||
{
|
||||
if (this.SubItems == null)
|
||||
{
|
||||
this.SubItems = new List<FileSystemEntry>();
|
||||
this.subFolderCount = 0;
|
||||
this.fileCount = 0;
|
||||
if (base.Path.Length > 0)
|
||||
{
|
||||
string text = base.Path;
|
||||
if (!base.Path.EndsWith("*"))
|
||||
{
|
||||
if (base.Path.EndsWith("\\"))
|
||||
{
|
||||
text += "*";
|
||||
}
|
||||
else
|
||||
{
|
||||
text += "\\*";
|
||||
}
|
||||
}
|
||||
WIN32_FIND_DATA win32_FIND_DATA;
|
||||
IntPtr intPtr = Win32.FindFirstFile(text, out win32_FIND_DATA);
|
||||
if (intPtr == (IntPtr)(-1))
|
||||
{
|
||||
int lastWin32Error = Marshal.GetLastWin32Error();
|
||||
if (lastWin32Error != 18)
|
||||
{
|
||||
throw new Win32Exception(lastWin32Error, "Failed to query folder");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
do
|
||||
{
|
||||
string text2 = base.Path;
|
||||
if (!base.Path.EndsWith("\\"))
|
||||
{
|
||||
text2 += "\\";
|
||||
}
|
||||
text2 += win32_FIND_DATA.cFileName;
|
||||
if ((win32_FIND_DATA.dwFileAttributes & 16U) != 0U)
|
||||
{
|
||||
if (win32_FIND_DATA.cFileName != "." && win32_FIND_DATA.cFileName != "..")
|
||||
{
|
||||
this.SubItems.Add(FileSystem.GetFolder(text2));
|
||||
this.subFolderCount++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
File file = new File(text2, (FileAttributes)win32_FIND_DATA.dwFileAttributes);
|
||||
file.Size = ((ulong)win32_FIND_DATA.nFileSizeHigh << 32 | (ulong)win32_FIND_DATA.nFileSizeLow);
|
||||
this.SubItems.Add(file);
|
||||
this.fileCount++;
|
||||
}
|
||||
}
|
||||
while (Win32.FindNextFile(intPtr, out win32_FIND_DATA));
|
||||
Win32.FindClose(intPtr);
|
||||
this.SubItems.Sort();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Folder GetParent()
|
||||
{
|
||||
if (base.Path == "" || base.Path == "\\")
|
||||
{
|
||||
return null;
|
||||
}
|
||||
int num = base.Path.LastIndexOf('\\');
|
||||
if (num < 0)
|
||||
{
|
||||
return FileSystem.GetFolder("\\");
|
||||
}
|
||||
return FileSystem.GetFolder(base.Path.Substring(0, num));
|
||||
}
|
||||
|
||||
public void RefreshFolder()
|
||||
{
|
||||
if (this.SubItems != null)
|
||||
{
|
||||
object obj = this.queryLockObject;
|
||||
lock (obj)
|
||||
{
|
||||
this.SubItems = null;
|
||||
this.subFolderCount = -1;
|
||||
this.fileCount = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int GetSubFolderCount()
|
||||
{
|
||||
this.QueryFolder();
|
||||
return this.subFolderCount;
|
||||
}
|
||||
|
||||
public int GetFileCount()
|
||||
{
|
||||
this.QueryFolder();
|
||||
return this.fileCount;
|
||||
}
|
||||
|
||||
public Folder OpenSubFolder(string Name)
|
||||
{
|
||||
return FileSystem.GetFolder(base.Path + "\\" + Name.TrimStart(new char[]
|
||||
{
|
||||
'\\'
|
||||
}));
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return base.Path;
|
||||
}
|
||||
|
||||
private List<FileSystemEntry> SubItems;
|
||||
|
||||
private int subFolderCount = -1;
|
||||
|
||||
private int fileCount = -1;
|
||||
|
||||
private readonly object queryLockObject = new object();
|
||||
|
||||
private readonly object detailLockObject = new object();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user