Vala `load_contents` 大文件错误
Vala `load_contents` error with large files
我正在尝试读取文件的内容(应该很容易...)并且在尝试读取大量文件之前我没有遇到任何问题文件(超过 2 GB)。我收到一个错误,我不知道如何解决,而且我还没有找到任何替代方法来读取适用于大文件的内容。这是我的代码:
File file = File.new_for_path (abs_path);
uint8[] contents;
try {
string etag_out;
file.load_contents (null, out contents, out etag_out);
}catch (Error e){
error("Error reading from file: %s", e.message);
}
content
应该包含从 abs_path
读取的所有字节。但是我收到一条错误消息:
Error reading from file: Bad address
我不知道为什么会出现 Bad address
错误。该文件存在。另一个同名但大小仅为 50 MB 的文件也能正常工作。
有没有人有替代解决方案来读取 Vala 中的大文件?或者知道如何让它工作?
Note: I use the load_content
method because I want the bytes (uint8 []
), not the string.
正如您所注意到的,将大文件读入内存可能很麻烦而且速度很慢。由于您能够以块的形式处理文件数据,因此您可以使用缓冲区一次读取文件一点点,如下所示:
size_t BUFFER_SIZE = 256;
File file = File.new_for_path (abs_path);
Cancellable cancellable = new Cancellable ();
...
try {
// Stream the file in chunks rather than loading the entire thing into memory
FileInputStream file_input_stream = file.read (cancellable);
ssize_t bytes_read = 0;
uint8[] buffer = new uint8[BUFFER_SIZE];
while ((bytes_read = file_input_stream.read (buffer, cancellable)) != 0) {
// Send the buffer content as needed
}
} catch (GLib.Error e) {
critical ("Error reading file: %s", e.message);
}
这将读取 BUFFER_SIZE
块中的文件,然后您可以根据需要通过 SOAP 消息等发送这些文件。
我正在尝试读取文件的内容(应该很容易...)并且在尝试读取大量文件之前我没有遇到任何问题文件(超过 2 GB)。我收到一个错误,我不知道如何解决,而且我还没有找到任何替代方法来读取适用于大文件的内容。这是我的代码:
File file = File.new_for_path (abs_path);
uint8[] contents;
try {
string etag_out;
file.load_contents (null, out contents, out etag_out);
}catch (Error e){
error("Error reading from file: %s", e.message);
}
content
应该包含从 abs_path
读取的所有字节。但是我收到一条错误消息:
Error reading from file: Bad address
我不知道为什么会出现 Bad address
错误。该文件存在。另一个同名但大小仅为 50 MB 的文件也能正常工作。
有没有人有替代解决方案来读取 Vala 中的大文件?或者知道如何让它工作?
Note: I use the
load_content
method because I want the bytes (uint8 []
), not the string.
正如您所注意到的,将大文件读入内存可能很麻烦而且速度很慢。由于您能够以块的形式处理文件数据,因此您可以使用缓冲区一次读取文件一点点,如下所示:
size_t BUFFER_SIZE = 256;
File file = File.new_for_path (abs_path);
Cancellable cancellable = new Cancellable ();
...
try {
// Stream the file in chunks rather than loading the entire thing into memory
FileInputStream file_input_stream = file.read (cancellable);
ssize_t bytes_read = 0;
uint8[] buffer = new uint8[BUFFER_SIZE];
while ((bytes_read = file_input_stream.read (buffer, cancellable)) != 0) {
// Send the buffer content as needed
}
} catch (GLib.Error e) {
critical ("Error reading file: %s", e.message);
}
这将读取 BUFFER_SIZE
块中的文件,然后您可以根据需要通过 SOAP 消息等发送这些文件。