如果我试图确定驱动器的读取速度,我可以编写例程来将文件写入文件系统然后再读取这些文件.不幸的是,由于Windows执行磁盘读取缓存,因此无法提供准确的读取速度.
有没有办法在C#/ .Net(或者可能使用Win32 API调用)中刷新驱动器的磁盘读取缓存,以便我可以直接从驱动器读取文件而不缓存它们?
是否有可能读取损坏的媒体(cd,hdd,dvd,...)即使Windows资源管理器炸弹了?
我的意思是,是否有一组API或者某些东西能够以非常低的级别访问磁盘(在资源管理器下面?)并读取任何可以检索的东西,即使它只是部分的,特别是如果你仍然可以看到该文件来自资源管理器,但无法对它做任何事情,因为它以某种方式损坏(在CD上刮擦等)?
我希望能够直接从磁盘读取和写入数据(即在扇区/集群级别),但我还没有找到适合在Windows下执行此操作的工具.
我一直试图弄清楚如何在C#中编写自己的文档,但我发现的文档很少,只处理C++ API.
什么是直接在C#中读取/写入驱动器的最佳方式?(或者任何人都可以向我推荐一种允许我直接从驱动器读/写的工具?)
我正在使用ALAsset来检索这样的图像:
[[asset defaultRepresentation] fullResolutionImage]]
Run Code Online (Sandbox Code Playgroud)
这返回CGImageRef,我想尽快保存到磁盘...
解决方案1:
UIImage *currentImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
NSData *currentImageData = UIImagePNGRepresentation(currentImage);
[currentImageData writeToFile:filePath atomically:YES];
Run Code Online (Sandbox Code Playgroud)
解决方案2:
CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:filePath];
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
CGImageDestinationAddImage(destination, [[asset defaultRepresentation] fullResolutionImage], nil);
CGImageDestinationFinalize(destination);
Run Code Online (Sandbox Code Playgroud)
问题是两种方法在设备上的执行速度都很慢.每张图像大约需要2秒才能执行此操作.这绝对是长久的.
问题:如何加快图像保存过程?或许还有更好的解决方案吗?
更新:
两种解决方案中性能的最佳改进是将图像保存为JPEG格式而不是PNG.所以对于解决方案1已经取代UIImagePNGRepresentation了UIImageJPEGRepresentation.对于解决方案2已经取代kUTTypePNG了kUTTypeJPEG.
另外值得注意的是,第二种解决方案比第一种解决方案更有效.
使用DISKPART命令行实用程序,我可以得到一个称为"位置路径"的东西,它似乎能够提供我需要的东西,您可以detail disk在选择其中一个磁盘后使用该命令查看diskpart.
看来我可以通过这个类以编程方式获取此信息:MSFT_Disk
我不确定如何获得这个类的实例.我有几个使用ManagementObjectSearcherfor WMI类的例子但是这个方法对我不起作用,我也不确定MSFT_DiskWindows 7中的可用性,因为该页面提到这是针对Windows 8的.
有谁知道获得SATA通道信息或磁盘"位置路径"的好方法?
Windirstat/Kdirstat/Disk Inventory X在文件管理方面一直是革命性的.为什么没有纯文本命令行等效?我需要它来管理我的文件服务器.
我们有所有的构建块:du,tree等.
有吗?为什么不?有人可以写一个吗?:)
编辑:du几乎完成我想要的.我想要的是按大小(而不是完整路径)和缩进对每个子目录进行排序,以便更容易避免重复计算.杜会给我这个:
cd a
du . -h
1G b
2G c
1K c/d
1K c/e
2G c/f
Run Code Online (Sandbox Code Playgroud)
c和c/f重叠并不是很明显.我想要的是这个:
cd a
dir_stats .
1G b
2G c
|
+---- 2G f
|
+---- 1K d
|
+---- 1K e
Run Code Online (Sandbox Code Playgroud)
很明显f的2G是因为c的2G.我可以更容易地找到与c无关的所有信息(即只扫描第一列).
我正在尝试从另一台服务器恢复使用此命令获取的pg_dump.
sudo -u postgres pg_dump --verbose --format=custom --file=pg-backup.sql -U postgres salesDB
Run Code Online (Sandbox Code Playgroud)
复制pg-backup.sql文件后,我正在尝试使用此命令进行恢复
sudo -u postgres pg_restore --verbose --jobs=`nproc` -f pg-backup.sql
Run Code Online (Sandbox Code Playgroud)
pg-backup.sql文件是13GB.pg-restore已经运行了4个小时,一直在我的屏幕上滚动数据.没有错误.
但是当我从psql会话中执行此语句时
SELECT pg_size_pretty(pg_database_size('salesDB'));
Run Code Online (Sandbox Code Playgroud)
我的大小为5377 kB.什么?它至少应该是1GB.我完全迷失了.所有这些数据都在我的屏幕上滚动,我无法证明它会在任何地方.没有磁盘使用.
救命
我想将Ruby集或散列保存到磁盘,并在必要时从文件中返回.我怎样才能做到这一点?
是否可以使用Windows API写入磁盘上的可用群集或从中读取数据?我发现了Defrag API:https://docs.microsoft.com/en-gb/windows/desktop/FileIO/defragmenting-files
FSCTL_GET_VOLUME_BITMAP可用于获取每个群集的分配状态,FSCTL_MOVE_FILE可用于在群集之间移动。但是我找不到从自由集群读取数据或向其写入数据的方法。
更新:想到的解决方法之一是创建一个新的小文件,向其中写入一些数据,然后将其重新放置到所需位置并删除该文件(数据将保留在释放的群集中)。但这仍然不能解决阅读问题。
我想做的是某种透明的缓存,因此用户仍然可以照常使用他的NTFS分区,并且仍然将这些群集视为可用空间,但是我可以在其中存储一些数据。数据安全性无关紧要,它可以被用户操作覆盖,并且当群集再次释放时稍后将重新生成/重新下载。
我的数据库上有一个大表,但每列上都有很多空字段,并且我\xc2\xb4d想知道每列使用了多少。
\n\n有什么方法可以知道每个表列使用了多少磁盘空间?
\n