好吧,相信我,我这样做是有原因的。也许没有使用 Java,但确实有。我可以使用 UNC 样式路径在 Windows 7 上原始访问磁盘,例如:
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile("\\\\.\\PhysicalDrive0","r");
byte [] block = new byte [2048];
raf.seek(0);
raf.readFully(block);
System.out.println("READ BYTES RAW:\n" + new String(block));
} catch (IOException ioe) {
System.out.println("File not found or access denied. Cause: " + ioe.getMessage());
return;
} finally {
try {
if (raf != null) raf.close();
System.out.println("Exiting...");
} catch (IOException ioe) {
System.out.println("That was bad.");
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我切换到“rw”模式,则会出现 NullPointerException,即使我以管理员身份运行该程序,也无法获得对磁盘进行原始写入的句柄。我知道已经有人问过这个问题了,但主要是为了阅读……那么,写作呢?我需要 JNI 吗?如果是这样,有什么建议吗?
干杯
我查看了 Mac OSX 磁盘实用程序的主窗口,发现了有关 USB 设备的四个信息(当选择驱动器项时):
我能够使用磁盘仲裁框架获取前三个信息。我让他们注册一个回调例程以响应新的磁盘设备检测:
DARegisterDiskAppearedCallback(session, NULL, OnDiskAppeared, (void *)NULL);
Run Code Online (Sandbox Code Playgroud)
例程如下所示:
static void OnDiskAppeared(DADiskRef disk, void *__attribute__((__unused__)) ctx) {
CFDictionaryRef dict = DADiskCopyDescription(disk);
const void *DAMediaName = CFSTR("DAMediaName");
const void *DAVolumeName = CFSTR("DAVolumeName");
const void *DADeviceModel = CFSTR("DADeviceModel");
const void *DAMediaUUID = CFSTR("DAMediaUUID");
const void *DAVolumeUUID = CFSTR("DAVolumeUUID");
printf("DAMediaName: ");
CFShow(CFDictionaryGetValue(dict, DAMediaName));
printf("DAVolumeName: ");
CFShow(CFDictionaryGetValue(dict, DAVolumeName));
printf("DADeviceModel: ");
CFShow(CFDictionaryGetValue(dict, DADeviceModel));
printf("DAMediaUUID: ");
CFShow(CFDictionaryGetValue(dict, DAMediaUUID));
printf("DAVolumeUUID: ");
CFShow(CFDictionaryGetValue(dict, DAVolumeUUID));
CFRelease(dict);}
Run Code Online (Sandbox Code Playgroud)
该例程实际上返回了有关卷和物理驱动器的信息,并且在最后一种情况下,返回了有关我之前讨论的三个磁盘属性的信息。
不幸的是我找不到关于第四个(USB 序列号)的任何信息。
我通过调用以下命令打印了整本词典: …
在 Linux 中,我使用 blkid api 来获取有关磁盘分区的大部分信息。我找不到可以让我找出分区名称与其驱动器之间的映射的 API。
例如,磁盘/dev/sda被分区为/dev/sda1和/dev/sda2。给定两个分区名称,我如何知道它是否来自同一驱动器?通过查找公共前缀 (sda),人们可以查看它们是否属于同一驱动器。但这是万无一失的吗?这在所有情况下都有效吗?如果这是卷的一部分怎么办?另外,驱动器名称/卷名称(“sda”)可以包含数字吗?
我假设应该有一种简单的方法来确定此映射。
我正在使用 C++ 编写一个迷你数据库。在日志模块中,我用于fstream将数据附加到日志文件中,并且需要将数据立即写入磁盘。在http://www.cplusplus.com/doc/tutorial/files/中,我发现
当缓冲区被刷新时,其中包含的所有数据都将写入物理介质。
但在http://www.cplusplus.com/forum/general/7343/
我尝试过flush()调用,但这只是将程序的缓冲区刷新到文件系统的缓冲区中,并不能保证数据物理写入磁盘。
例如,我很困惑flush()或sync()调用是否保证数据已写入磁盘
std::fstream file;
file.open("...", std::ios::out | std::ios::app); // open a file
file << "..."; //append log
file.flush(); //or file.sync()
//file.flush() has returned
//system crashed(not only program crashed) or an interruption in the supply of electricity heppened
Run Code Online (Sandbox Code Playgroud)
那么当我重新启动计算机时,日志是否会丢失?如果日志丢失,有fstream什么办法可以强制将数据写入磁盘吗?
最近,我运行 macOS Catalina 的 Macbook Pro 的磁盘空间几乎被占满。我发现占用了我大部分空间的是/Users/Shared/Related Items下的文件夹,因此我通过移至垃圾箱并清空它来删除该文件夹。我还删除了许多其他文件。
我以为我只有 200 GB 可用磁盘空间。但根本不是!:
关于截图

磁盘实用程序屏幕截图

只有我的“其他”大小增加到 417GB!这太疯狂了。更重要的是,当我在OmniDiskSweeper或DiskInventoryX等软件中运行大小调整时,我只获得了 179.5GB!:
OmniDiskSweeper 屏幕截图

DiskInventoryX 中也是如此。在清洁之前,它的尺寸与 MacO 相同。
这里发生了什么?我试过:
当我删除某些文件时,“其他”区域会变得更大,并且我无法删除它。
我有一个C++程序,它从硬盘上读取文件,并对文件中的数据进行一些处理.我使用标准的Win32 API来读取文件.我的问题是这个程序有时非常快,然后突然减慢到之前速度的1/6.如果我在多次运行中一次又一次地读取相同的文件,那么通常第一次运行将是最慢的.然后它保持速度,直到我读取其他一组文件.所以我明显的猜测是分析磁盘访问时间.我使用了perfmon实用程序并测量了我的程序的IO读取字节数/秒.正如预期的那样,读取的字节数存在巨大差异(约5倍).我的问题是:
(1).OS(在我的情况下是Windows)是否将最近读取的文件缓存到某处,以便后续加载更快?
(2).如果我可以保证我读取的所有文件都位于同一目录中,那么有什么方法可以将它们放在硬盘中以便我的磁盘访问时间更快?
我能为此做点什么吗?
在磁盘上存储Python字典的最有效方法是什么?我现在知道的唯一方法是纯文本和pickle模块.
编辑:抱歉不太清楚.通过高效我意味着最快的执行速度.字典将包含可变对象,这些对象将保存要解析和修改的信息.
我知道在linux中它就像/ dev/sda一样简单但在Windows中如何打开磁盘并开始在低级别读取数据?
在python我尝试过:
f = open("K:", "r")
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 13] Permission denied: 'K:'
Run Code Online (Sandbox Code Playgroud)
即使是管理员,我也会收到此错误.
我有一个大型存储设备(闪存)通过PCIe总线插入我的计算机,我想直接访问这样的设备,即没有任何文件系统(例如,NTFS或ext4).
我怎么能用C/C++做到这一点?(在Windows 7和Linux上)我想知道我是否可以1)打开设备作为文件,然后读取和写入二进制数据,或2)使用某些函数分配整个设备malloc,然后每个字节设备有一个地址,以便我可以根据地址访问它们.
如果有可能,我更喜欢第二种方式,但我不知道操作系统是否支持这一点,因为看起来地址空间需要与主内存共享.
我想从命令提示符或powershell将我的计算机磁盘D:\更改为E:\.除了'diskpart'之外还有什么方法吗?
disk ×10
c++ ×3
macos ×2
python ×2
windows ×2
buffer ×1
c ×1
dictionary ×1
drive ×1
fstream ×1
io ×1
java ×1
linux ×1
low-level ×1
mapping ×1
objective-c ×1
ofstream ×1
partition ×1
performance ×1
pickle ×1
powershell ×1
recycle-bin ×1
winapi ×1