Skip to content

Commit 3cfbc8a

Browse files
committed
feat: 添加写入方法选项支持 mmap 和标准写入
在 64 位系统上,新增 `--write-method` 参数,允许用户选择使用 `mmap` 或 `std` 方式进行文件写入。
1 parent 3f7b4da commit 3cfbc8a

4 files changed

Lines changed: 33 additions & 23 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "fast-down-cli"
3-
version = "2.7.1"
3+
version = "2.7.2"
44
edition = "2024"
55
license = "MIT"
66
authors = ["share121 <2854631158@qq.com>"]

src/args.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
use clap::{Parser, Subcommand};
1+
use clap::{Parser, Subcommand, ValueEnum};
22
use color_eyre::{Result, eyre::ContextCompat};
33
use crossterm::terminal;
44
use reqwest::header::{HeaderMap, HeaderName};
55
use std::{path::PathBuf, str::FromStr, time::Duration};
66

7+
#[derive(Debug, Clone, ValueEnum)]
8+
pub enum WriteMethod {
9+
Mmap,
10+
Std,
11+
}
12+
713
/// 超级快的下载器
814
#[derive(Parser, Debug)]
915
#[command(name = "fast-down")]
@@ -103,6 +109,9 @@ struct DownloadCli {
103109
/// 最大投机线程数
104110
#[arg(long, default_value_t = 3)]
105111
max_speculative: usize,
112+
/// 写入方法 (mmap 速度快, std 兼容性好)
113+
#[arg(long, default_value = "mmap")]
114+
write_method: WriteMethod,
106115
}
107116

108117
#[derive(Debug)]
@@ -138,6 +147,7 @@ pub struct DownloadArgs {
138147
pub interface: bool,
139148
pub ips: Vec<String>,
140149
pub max_speculative: usize,
150+
pub write_method: WriteMethod,
141151
}
142152

143153
impl Args {
@@ -179,6 +189,7 @@ impl Args {
179189
interface: cli.interface,
180190
ips: cli.ips,
181191
max_speculative: cli.max_speculative,
192+
write_method: cli.write_method,
182193
};
183194
for header in cli.headers {
184195
let mut parts = header.splitn(2, ':').map(|t| t.trim());

src/commands/download.rs

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#[cfg(target_pointer_width = "64")]
2+
use crate::args::WriteMethod;
13
use crate::{
24
args::DownloadArgs,
35
fmt,
@@ -232,21 +234,25 @@ pub async fn download(mut args: DownloadArgs) -> Result<()> {
232234
{
233235
return Err(err.into());
234236
}
237+
let get_std_pusher = async {
238+
let file = OpenOptions::new()
239+
.create(true)
240+
.write(true)
241+
.read(true)
242+
.truncate(false)
243+
.open(&save_path)
244+
.await?;
245+
let file_pusher = FilePusher::new(file, info.size, args.write_buffer_size).await?;
246+
Ok::<_, color_eyre::Report>(BoxPusher::new(file_pusher))
247+
};
235248
let result = if info.fast_download {
236249
#[cfg(target_pointer_width = "64")]
237-
let pusher = MmapFilePusher::new(&save_path, info.size).await?;
238-
#[cfg(not(target_pointer_width = "64"))]
239-
let pusher = {
240-
let file = OpenOptions::new()
241-
.create(true)
242-
.write(true)
243-
.read(true)
244-
.truncate(false)
245-
.open(&save_path)
246-
.await?;
247-
FilePusher::new(file, info.size, args.write_buffer_size).await?
250+
let pusher = match args.write_method {
251+
WriteMethod::Mmap => BoxPusher::new(MmapFilePusher::new(&save_path, info.size).await?),
252+
WriteMethod::Std => get_std_pusher.await?,
248253
};
249-
let pusher = BoxPusher::new(pusher);
254+
#[cfg(not(target_pointer_width = "64"))]
255+
let pusher = get_std_pusher.await?;
250256
download_multi(
251257
puller,
252258
pusher,
@@ -261,14 +267,7 @@ pub async fn download(mut args: DownloadArgs) -> Result<()> {
261267
},
262268
)
263269
} else {
264-
let file = OpenOptions::new()
265-
.write(true)
266-
.create(true)
267-
.truncate(false)
268-
.open(&save_path)
269-
.await?;
270-
let pusher = FilePusher::new(file, info.size, args.write_buffer_size).await?;
271-
let pusher = BoxPusher::new(pusher);
270+
let pusher = get_std_pusher.await?;
272271
download_single(
273272
puller,
274273
pusher,

0 commit comments

Comments
 (0)