- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
好的,在 .net 中有两种方法可以将文件发送到回收站,使用 Microsoft.VisualBasic.FileIO.FileSystem.DeleteFile
或使用 SHFileOperation
。两者都很好,但如果文件无法放入回收站,它们将永久删除文件。如果文件太大或者只是不删除它,它是否有可能抛出异常或返回 bool 值? (不要默认确认对话框)
我得到的一种方法是获取该卷允许的最大回收站大小,然后减去已用大小并检查文件是否将发送到 RB 或永久删除,但如果删除许多文件并再次检查可能会变坏又一次。
还有什么我可以尝试的吗?
最佳答案
这道题并没有我一开始想的那么简单。但是,我发现它仍然可以解决。
首先,您需要了解回收站的使用量。 Win32 的 SHQueryRecycleBin 可以为您完成:
/// <summary>
/// Retrieves the size of the Recycle Bin and the number of items in it, of a specific drive
/// </summary>
/// <param name="pszRootPath">The path of the root drive on which the Recycle Bin is located</param>
/// <param name="pSHQueryRBInfo">A SHQUERYRBINFO structure that receives the Recycle Bin information</param>
/// <returns></returns>
[DllImport("shell32.dll")]
static extern int SHQueryRecycleBin(string pszRootPath, ref SHQUERYRBINFO pSHQueryRBInfo);
/// <summary>
/// Contains the size and item count information retrieved by the SHQueryRecycleBin function
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct SHQUERYRBINFO
{
/// <summary>
/// The size of the structure, in bytes
/// </summary>
public int cbSize;
/// <summary>
/// The total size of all the objects in the specified Recycle Bin, in bytes
/// </summary>
public long i64Size;
/// <summary>
/// The total number of items in the specified Recycle Bin
/// </summary>
public long i64NumItems;
}
使用以下演示代码检索此信息:
const int S_OK = 0;
//string drivePath = @"C:\$RECYCLE.BIN\";
string drivePath = @"D:\$RECYCLE.BIN\";
SHQUERYRBINFO pSHQueryRBInfo = new SHQUERYRBINFO();
pSHQueryRBInfo.cbSize = Marshal.SizeOf(typeof(SHQUERYRBINFO));
int hresult = SHQueryRecycleBin(drivePath, ref pSHQueryRBInfo);
Console.WriteLine("{0} Drive {1} contains {2} item(s) in {3:#,##0} bytes",
hresult == S_OK ? "Success!" : "Fail!",
drivePath, pSHQueryRBInfo.i64NumItems, pSHQueryRBInfo.i64Size);
其次,(至少在 Win7 上)用户可以确定他们为(几乎)每个驱动器上的回收站保留多少大小。因此,您需要知道我们可以获得的每个驱动器的回收站的最大容量。此信息可在注册表中找到。但我们还需要检索所有驱动器的 guid:
/// <summary>
/// Get from the registry all the drive guids
/// </summary>
static string[] GetDriveIds()
{
const string registryPath = @"Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\Volume\";
RegistryKey reg = Registry.CurrentUser.OpenSubKey(registryPath);
string[] readIn = reg.GetSubKeyNames();
string[] driveIds = new string[readIn.Length - 1];
Array.Copy(readIn, 1, driveIds, 0, readIn.Length - 1); // The first item must be removed
return driveIds;
}
/// <summary>
/// Get and return the drive's recycle bin's MaxCapacity
/// </summary>
/// <param name="driveId">The guid of the specified drive</param>
/// <returns>The size in mega bytes</returns>
static int FindDriveCapacity(string driveId)
{
const string registryPath = @"Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\Volume\{0}\";
RegistryKey reg = Registry.CurrentUser.OpenSubKey(
string.Format(registryPath, driveId));
return (int)reg.GetValue("MaxCapacity", 0);
}
使用以下代码,您可以检索每个驱动器的最大容量:
string[] driveIds = GetDriveIds();
int driveNo = 0;
foreach (string driveId in driveIds)
{
Console.WriteLine("{0}. MaxCapacity of drive {1} is {2:#,##0} bytes",
++driveNo, driveId, FindDriveCapacity(driveId));
}
我们要做的最后一件事是将 guid 映射到驱动器号。我们仍然需要使用注册表:
/// <summary>
/// Map the drive letter mapped by the drive ID
/// </summary>
/// <param name="driveId">The guid of the drive</param>
static string MapDriveLetter(string driveId)
{
const string registryPath = @"SYSTEM\MountedDevices";
RegistryKey reg = Registry.LocalMachine.OpenSubKey(registryPath);
string[] readIn = reg.GetValueNames();
byte[] keyCode = {};
Regex regGuid = new Regex(@"\{[^\}]+\}");
Regex regDriveLetter = new Regex(@"[A-Z]:$");
foreach (string keyRead in readIn) {
if (regGuid.IsMatch(keyRead) && regGuid.Match(keyRead).Value == driveId )
keyCode = (byte[])reg.GetValue(keyRead, null);
}
foreach (string keyRead in readIn)
{
byte[] codeRead = (byte[])reg.GetValue(keyRead, null);
if (!regGuid.IsMatch(keyRead) && keyCode.SequenceEqual(codeRead))
{
if (regDriveLetter.IsMatch(keyRead)) // Get the drive letter in the form "E:"
return regDriveLetter.Match(keyRead).Value;
}
}
return string.Empty;
}
只要传递guid就可以得到盘号:
string code = MapDriveLetter("{f4b90148-66f6-11e3-9ac5-806e6f6e6963}");
将所有信息结合在一起,您应该能够知道在哪个驱动器上,系统可能会永久删除一个或多个文件的大小。
关于c# - 发送文件到回收站,大文件永久删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21406508/
@ 目录 原理 创建过滤器 使用过滤器 查询 删除 恢复
我在回收站 View 中使用了一个 item.xml,但文本超出了屏幕。我试图依靠这个 answer , You can avoid all of this by giving each textvi
我的应用程序中有一个回收站 View 。每个回收器 View 项都有一个 imageView。我使用 asyncTask 加载位图并将它们添加到磁盘缓存,然后再将它们设置到 onPostExecute
我已经多次问过这个类似的问题,我花了 2 周多的时间才试图找出解决方案。是的,我知道有多个类似的问题,但我问的原因是因为堆栈上流的解决方案都不起作用。我是 Android 开发的初学者,因此我问你请帮
有谁知道允许特定角色的用户查看 Sitecore 回收站中所有项目的解决方案? 目前,只有管理员可以查看所有已删除的项目。用户只能看到他们已删除的项目。 最佳答案 没有开箱即用的方法,SqlArchi
您好,我有以下回收器适配器: package com.example.app.adapters; import android.annotation.TargetApi; import android
我看不到回收 View ,不确定哪里出了问题。如果你能帮助我,那就太好了。 fragment public class CallDurationFragment extends Fragment {
我是 android 开发的新手。我有一个带有 Viewholder 的 recyclerview 用于显示照片。我在我的应用程序中实现了 like 功能,但我面临的唯一问题是当我添加一个 喜欢 在照
我正在编写一个消息传递应用程序,在 RecyclerView 中显示我的消息和其他消息。 白色背景消息是我的消息,彩色消息是其他消息。 当每条消息顺序为“我的消息,其他消息,...”时,回收站 Vie
我创建了一个包含不同类型 subview 的社交帖子回收 View 。每个 child 多个 layout.recyclerview 工作正常,唯一的问题是 recyclerview 滚动不流畅。 我
我有一个像这样的 View 模型 - private val viewState = SchoolsViewState() fun onViewOpened() = Trans
我正在研究 Android 的应用程序接近完成它但我在 recyclerView 中发现了问题,我不知道如何在 recyclerView 的 Item 的 TextView 上实现点击监听器? (当我
我正在做一个 RecyclerView 示例。问题是,当我在列表中添加第一个项目时,它会在回收 View 中正确显示该项目,但我添加的下一个项目不会显示在回收 View 中。 请帮帮我。 适配器代码是
我想问一下我如何从适配器回收器 View 调用 Activity 中的方法。 在函数 buildRecyclerView 中设置适配器: private void buildRecyclerView(
这个问题在这里已经有了答案: Custom Adapter getView() method is not called (6 个答案) 关闭 6 年前。 我正在使用回收站 View ,但它没有显示
我有一个回收站 View ,我在其中显示了自定义行,但该行未填满宽度。我已经添加了 match_parent 宽度,但它仍然只是包装内容。 我的回收站 View -:
我一直在使用回收器 View 在我的 fragment 上显示 15 张图像。图像位于可绘制文件夹中。我尝试了外部 View 来执行此操作,但速度要慢得多并且滞后很多。因此我使用回收者 View 来解
我的问题是我希望回收站 View 响应对整个 View 的点击,而不是对回收站 View 具有的每个项目的单独点击 viewModel.handleClick()}"
以下是我的行项目的布局:
我正在处理 Recycler View ,在这里我将三个回收器 View 水平放置在布局中。问题是第二个和第三个回收器 View 项目显示但无法滚动,即使在内部使用嵌套滚动并特此附加xml。请建议我如
我是一名优秀的程序员,十分优秀!