问题标签 [writefile]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 在 Windows 7 上将原始数据写入硬盘 (PhysicalDrive) 的最快方法
我的公司正在开发一个在 Windows 7 下运行的“花式”USB 大容量存储设备。处理客户端实际存储介质读取和写入的大容量存储客户端驱动程序是用 C++ 编写的。我们遇到的问题是写入速度非常非常慢。比预期慢大约 30 倍。我们正在使用对 WriteFile() 的调用将数据块写入存储介质(特别是物理驱动器“PhysicalDrive2”),因为它们是从主机设备接收到的。我在许多其他论坛上读到,人们使用 WriteFile() 的写入速度非常慢,尤其是在 Windows 7 上。所以我试图弄清楚我是否为这个特定任务使用了最好的方法和函数调用。
下面是两个代码块。一个用于 LockVolume() 函数,在初始化期间由程序调用一次,实际上只是卸载卷。另一个代码块是 WriteSector(),它用于在 USB 客户端控制器驱动程序接收到实际数据时将其写入物理驱动器。我希望有人可以阐明我可能做错了什么,或者就更好的实现方式提供建议。
编辑#1(2015 年 2 月 10 日)
所以我结合了 Ben Voigt 提出的建议,发现只调用一次 CreateFile 和 CloseHandle(而不是每次我们想将数据写入驱动器)显着提高了写入速度。增加 80%。即使有了这样的增加,写入速度仍然比预期的要慢得多。慢了大约 6 倍。因此,我随后合并了他的其他建议更改,其中包括消除对 SetFilePointer() 的原始调用,并将其替换为现在传递给 WriteFile 的 OVERLAPPED 结构。进行更改后,我现在收到错误消息,指出“变量'MyOverLappedStructure'周围的堆栈已损坏”。下面是我的 SectorWrite 函数的更新版本以及获取物理驱动器初始句柄的新 Disk_GetHandle() 函数。还,在我调用 Disk_GetHandle() 之后,我仍在调用 Disk_LockVolume()。但是,我已经修改了 Disk_LockVolume() 函数,以便卷的句柄(在这种情况下)不会在函数结束时关闭。最终,这将在程序结束时关闭,然后再关闭物理驱动器上的句柄。对这个新错误的任何想法将不胜感激。哦,我可以看到 FILE_FLAG_NO_BUFFERING 对性能没有影响。
编辑#2(2015 年 2 月 10 日)
因此,根据 Ben 的评论,我从 CreateFile() 调用中消除了 FILE_FLAG_OVERLAPPED 。我还修改了 WriteSector() 函数的一部分,以包括在调用 WriteFile() 后检查 IO 是否处于挂起状态。如果是这样,我调用 WaitForSingleObject() 无限期地等待直到 IO 操作完成。最后,我在 OVERLAPPED 结构 hEvent 上调用 CloseHandle()。即使进行了这些更改,我仍然收到错误“围绕变量 'osWrite' 的堆栈已损坏”,其中 osWrite 是 OVERLAPPED 结构。以下是说明更改的代码片段。
编辑#3(2015 年 2 月 10 日)
所以代码现在正在处理 Ben 的输入。上面的代码已被修改以反映这些更改。我需要提一下,直到今天下午,我的所有测试都是在客户端的存储介质是 USB 闪存驱动器的情况下完成的。我已经改变了它,所以客户端现在写入连接的 SSD。使用 USB 闪存驱动器设置后,我通过 USB 连接向客户端写入数据的速度现在几乎与客户端 SBC 可以将相同文件从自身传输到存储介质的速度(没有主机连接的)。但是,现在使用 SSD,情况并非如此。我使用的 34MB 测试文件从客户端 SBC 直接传输到 SSD 需要 2.5 秒。通过 USB 从主机到客户端需要 2.5 分钟。
python - 在python中将多个列表写入文本文件 - 2.7
最初这些列表嵌套在另一个列表中。列表中的每个元素都是一系列字符串。
我加入了列表中的字符串,然后附加到结果中。
我希望将每个列表写入文本文件。列表的数量可能会有所不同。
我当前的代码:
仅返回文本文件中的第一个列表:
我希望文本文件包含所有结果
performance - 寻找一种方法来加快我的 Python 代码的文件部分的写入速度
我有一个简单的代码,它读取一个 ~2Gb 的数据文件,提取我需要的数据列,然后将该数据作为列写入另一个文件以供以后处理。我昨晚运行了代码,花了将近九个小时才完成。我分别运行了这两个部分,并确定将数据写入新文件的部分是问题所在。我想问是否有人能指出我写它的方式为什么这么慢,以及关于更好方法的建议。
正在读入的数据样本
代码
file - Erlang,如何使用换行符创建文本文件?
有人知道如何在Erlang语言的文本文件中添加新行吗?我想保存这个列表:
到带有新行的文本文件中:
我试过:
但它会创建一个带有内联数据的文本文件:
c++ - 为什么 WriteFile 不运行多次?
这是我的代码,其中我陷入了无限循环(据我所知)
有没有人看到为什么这只写一次的原因?我已经等了 5 多分钟,看看它是否最终无济于事。
c++ - 当第 4 个(可选)参数为 NULL 时,WriteFile 引发访问冲突
认为这可能对某人有帮助,因为这对我来说是一种惊喜。
WriteFile 函数尝试写入其第 4 个(可选)参数,如果它为 NULL,则会导致访问冲突异常......但在 Windows 8(.1) 上不会。
这是来自msdn的函数定义:
lpNumberOfBytesWritten [out, optional] ... 只有当 lpOverlapped 参数不为 NULL 时,此参数才能为 NULL。
我创建了重现错误的简短示例。代码是在 Visual Studio 2008 SP1 中创建的 Win32 控制台应用程序:
最后,如果我通过以下两行更改对 WriteFile() 的调用,则可以解决问题并适用于所有平台:
该代码在 Windows 7 和 Windows XP SP3 上生成访问冲突(未在 Vista 上测试)。在 Windows 8(.1) 上它可以工作,即使我在第四个参数 (lpNumberOfBytesWritten) 中传递了 NULL。
实际的问题是我开发了一个写入临时文件的模块,但我忽略了第四个参数(我读了“可选”但误读了其余的并认为它可能被忽略了)。我在 Windows 8.1 上开发并测试了它,所以代码运行良好,但是客户端机器在 Windows 7 上并且代码失败。
我学到的教训:我应该更加专注(注意细节),不要沾沾自喜(仔细测试)。
java - 在 Java 中将字符串写入文件并读回
我在 Java 中有一组字符串(String
对象),想将它们写入文件,以便以后检索它们。
我了解 Java 使用 UTF-16 在内部存储字符串。我担心我可能会因为格式问题而搞砸一些东西,除非我正确地写和读字符串。我不想将字符串对象原始转储到文件中,因为我希望能够在标准文本编辑器中打开文件以查看它,其中每个字符串以合理的方式显示在自己的行上(假设没有字符串包含换行符)。
我可以简单地使用PrintWriter
带有println(String x)
方法的类(假设字符串中没有换行符),并nextLine()
在读取它们时结合 Scanner 类的方法?这能保证我得到完全相同的字符串吗?
此外,假设字符串确实包含换行符,那么编写它们的适当方式是什么?我应该过滤掉换行符(用一些临时转义码或类似代码替换它们)并使用上述println
方法PrintWriter
吗?
c - 创建一个文件并将某些内容写入其中并不能如我所愿
我写了以下代码:
所以,如你所见。应该在桌面上创建一个名为 file.txt 的文件并在其中写入一些文本的程序。我使用 Microsoft Visual C++ Express,它编译时没有错误。但是当我通过单击绿色播放按钮运行它时,我看不到在我的桌面上创建了这样的文件。
通过搜索我可能的错误,我还在https://msdn.microsoft.com/en-us/library/windows/desktop/bb540534%28v=vs.85%29.aspx上阅读了他们使用几乎相同的代码。除了我不包括显示错误部分。
所以,我的问题是:它不起作用的原因可能是什么?我(程序)是否需要一些额外的权限才能做到这一点?例如,我在 Ubuntu 中使用 open() 和 write() 编写了相同的内容,只是我使用“/tmp/file.txt”作为目标目录。它无需额外权限即可工作。
此致,
assembly - 装配 - 为什么我在新创建的文件中得到错误的字符?
我正在学习汇编并编写以下内容:
[为此,我使用 jmp-call-pop-technique。那些知道什么是 shellcode 的人会知道我的意思,但如果不是,那么它在这里就不那么重要]
因此,当我让它运行时,会创建文件,但是当我打开文件时,我会在文件中看到符号 #,而不是字符“A”。
你知道我在哪里犯错了吗?我找不到它。我检查了偏移量,多次检查代码......但没有成功。
此致,
prolog - 将 Prolog 答案存储到文件中
我正在使用 SWI-Prolog 中的 ALEPH 推理引擎。我想保存 ALEPH 推断的规则并在 SWI-Prolog 控制台中显示它们,但我不知道该怎么做!示例结果如下图所示,
这些规则在使用以下命令调用归纳过程后显示:
- read_all(aleph_files)。- 诱导。
现在我想知道如何将这些规则自动存储到 txt 文件中。