色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在Rust中高效地操作文件

科技綠洲 ? 來源:TinyZ ? 作者:TinyZ ? 2023-09-19 11:51 ? 次閱讀

Rust語言是一種系統(tǒng)級(jí)、高性能的編程語言,其設(shè)計(jì)目標(biāo)是確保安全和并發(fā)性。
Rust語言以C和C++為基礎(chǔ),但是對(duì)于安全性和并發(fā)性做出了很大的改進(jìn)。

在Rust語言中,操作文件是非常重要的一個(gè)功能,本教程將介紹如何在Rust中高效地操作文件,并提供多個(gè)實(shí)際應(yīng)用示例。

文件讀取

Rust語言中操作文件的第一步就是文件讀取,使用Rust內(nèi)置的std::fs::File類型即可。使用File類型可以打開一個(gè)文件,并且從中讀取數(shù)據(jù)。

use std::fs::File;
use std::io::prelude::*;

fn main() - > std::io::Result< () > {
  let mut f = File::open("file.txt")?;
  let mut contents = String::new();
  f.read_to_string(&mut contents)?;
  println!("{}", contents);
  Ok(())
}

上面的代碼中調(diào)用File::open()函數(shù)打開文件,然后向其中讀取數(shù)據(jù)。讀取的數(shù)據(jù)存儲(chǔ)在contents變量中,并使用println!()函數(shù)將其輸出到控制臺(tái)。

注意,read_to_string()函數(shù)是阻塞式的,因此當(dāng)文件非常大時(shí),應(yīng)該使用每次讀取一小塊數(shù)據(jù)這種方式讀取,而不是將整個(gè)文件讀入內(nèi)存。

文件追加寫入

在Rust語言中,將數(shù)據(jù)寫入文件的方法是使用write_all()函數(shù)。write_all()函數(shù)的作用是寫入一個(gè)字節(jié)數(shù)組或字符串到文件中。但是使用此函數(shù)寫入,是直接覆蓋文件內(nèi)容,即覆蓋原有文件內(nèi)容。如果要進(jìn)行文件追加寫入,應(yīng)該使用Rust內(nèi)置的std::fs::OpenOptions類型。

use std::fs::OpenOptions;
use std::io::prelude::*;

fn main() - > std::io::Result< () > {
  let mut file = OpenOptions::new()
        .append(true)
        .create(true)
        .open("file.txt")?;
  file.write_all(b"Hello, world!")?;
  Ok(())
}

上面的代碼中,使用OpenOptions打開文件,并使用append()函數(shù)將文件的打開方式設(shè)置為追加。使用create()函數(shù)則用于創(chuàng)建不存在的文件,如果文件存在,仍然可以正常打開。然后使用write_all()函數(shù)將數(shù)據(jù)寫入文件中。

注意:文件追加寫入是在原文件內(nèi)容后追加,而不是從文件尾部開始寫入。因此,如果在追加寫入數(shù)據(jù)時(shí)需要將數(shù)據(jù)寫入最后,應(yīng)該先使用seek()函數(shù)將指針移動(dòng)到文件尾部。

文件寫入

要在Rust語言中進(jìn)行文件寫入,首先需要?jiǎng)?chuàng)建一個(gè)新文件或覆蓋現(xiàn)有文件內(nèi)容。這可以通過std::fs::File類型和std::fs::OpenOptions類型中的create()函數(shù)實(shí)現(xiàn)。另外,要將數(shù)據(jù)寫入文件中,write_all()函數(shù)是不錯(cuò)的選擇。

use std::fs::OpenOptions;
use std::io::prelude::*;

fn main() - > std::io::Result< () > {
  let mut file = OpenOptions::new()
        .write(true)
        .create(true)
        .open("file.txt")?;
  file.write_all(b"Hello, world!")?;
  Ok(())
}

上面的代碼中使用OpenOptions打開文件,并使用write()函數(shù)將文件的打開方式設(shè)置為寫入(即覆蓋原有內(nèi)容)。使用create()函數(shù)則用于創(chuàng)建不存在的文件,如果文件存在,仍然可以正常打開。然后使用write_all()函數(shù)將數(shù)據(jù)寫入文件中。

文件復(fù)制

Rust語言中可以使用std::fs::copy()函數(shù)將一個(gè)文件復(fù)制到另一個(gè)文件中。

use std::fs;

fn main() - > std::io::Result< () >{
  fs::copy("file.txt", "file_copy.txt")?;
  Ok(())
}

上面的代碼中,Copy函數(shù)將file.txt的所有內(nèi)容復(fù)制到file_copy.txt文件中。如果文件已經(jīng)存在,則原有文件內(nèi)容將被覆蓋。

文件元數(shù)據(jù)

在Rust語言中,File類型還提供了一些用于獲取文件元數(shù)據(jù)的函數(shù),如metadata()函數(shù)。此函數(shù)返回一個(gè)std::fs::Metadata類型的元數(shù)據(jù)結(jié)構(gòu)體,該結(jié)構(gòu)體包含了文件的大小、創(chuàng)建時(shí)間、修改時(shí)間、權(quán)限等信息

use std::fs::metadata;
use std::time::SystemTime;

fn main() - > std::io::Result< () > {
  let metadata = metadata("file.txt")?;
  let created = metadata.created()?;
  let modified = metadata.modified()?;
  let size = metadata.len();
  let perms = metadata.permissions();

  println!("Created: {:?}", created);
  println!("Modified: {:?}", modified);
  println!("Size: {} bytes", size);
  println!("Permissions: {:?}", perms);
  Ok(())
}

上面的代碼中,metadata()函數(shù)返回文件file.txt的元數(shù)據(jù),并使用元數(shù)據(jù)中的created()函數(shù)和modified()函數(shù)獲取創(chuàng)建時(shí)間和修改時(shí)間,使用len()函數(shù)來獲取文件大小(字節(jié)數(shù)),使用permissions()函數(shù)獲取文件的權(quán)限。

文件重命名和移動(dòng)

在Rust語言中,使用std::fs::rename()函數(shù)可以將文件重命名或者移動(dòng)到其他文件夾中。

use std::fs::rename;

fn main() - > std::io::Result< () > {
  rename("file.txt", "new_file.txt")?;
  Ok(())
}

上面的代碼中,rename()函數(shù)將文件file.txt重命名為new_file.txt,如果new_file.txt文件已經(jīng)存在,則重命名將失敗。

此外,如果要移動(dòng)文件到其他文件夾中,則可以在目標(biāo)文件名中指定文件夾路徑。例如,如果我們將文件移動(dòng)到子文件夾/path/to/subdir/中,則可以在目標(biāo)文件名中指定路徑:/path/to/subdir/new_file.txt

多種操作組合

在Rust語言中,可以將多種文件操作組合使用,例如讀取文件,刪除文件內(nèi)容,然后將新數(shù)據(jù)寫入文件中。

use std::fs::OpenOptions;
use std::io::prelude::*;

fn main() - > std::io::Result< () > {
  let mut file = OpenOptions::new()
        .read(true)
        .write(true)
        .open("file.txt")?;
  let mut contents = String::new();
  file.read_to_string(&mut contents)?;
  contents = contents.replace("Hello", "World");
  file.set_len(0)?; // 清空文件
  file.write_all(contents.as_bytes())?;
  Ok(())
}

上面的代碼中,使用OpenOptions打開文件,并使用read()函數(shù)將文件的打開方式設(shè)置為讀取,同時(shí)打開文件寫入的功能。讀取文件的內(nèi)容,并使用replace()函數(shù)將文本中的“Hello”替換為“World”。然后使用set_len()函數(shù)將文件長度重置為0(即清空文件)。使用write_all()函數(shù)將新數(shù)據(jù)寫入文件。

擴(kuò)展閱讀 - 讀取帶BOM頭的文件

BOM (Byte Order Mark) 是一個(gè)Unicode字符,用于標(biāo)識(shí)文件的編碼格式(UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE…)。BOM通常是在文件開頭的位置插入的,用于確定字符的順序和字節(jié)順序。

源于Unicode編碼,目前被廣泛使用于自定義字符集。例如:GB18030-2022

讀取帶BOM頭的文件

pub trait BOMReader {
    fn has_bom(&self) - > bool;
    fn read_content(&mut self) - > Result< String, std::io::Error >;
}

pub struct FileBOMReader {
    file: std::fs::File,
    bom: Option< Vec< u8 >>,
}

impl FileBOMReader {
    pub fn new(file: std::fs::File) - > Self {
        Self { file, bom: None }
    }

    fn read_bom(&mut self) - > Result< (), std::io::Error > {
        let mut bom_buf = [0u8; 3];
        let bytes_read = self.file.read(&mut bom_buf)?;
        if bytes_read >= 3 && bom_buf[..3] == [0xEF, 0xBB, 0xBF] {
            self.bom = Some(bom_buf[..3].to_vec());
        } else if bytes_read >= 2 && bom_buf[..2] == [0xFE, 0xFF] {
            self.bom = Some(bom_buf[..2].to_vec());
        } else if bytes_read >= 2 && bom_buf[..2] == [0xFF, 0xFE] {
            self.bom = Some(bom_buf[..2].to_vec());
        } else if bytes_read >= 4 && bom_buf[..4] == [0x00, 0x00, 0xFE, 0xFF] {
            self.bom = Some(bom_buf[..4].to_vec());
        } else if bytes_read >= 4 && bom_buf[..4] == [0xFF, 0xFE, 0x00, 0x00] {
            self.bom = Some(bom_buf[..4].to_vec());
        }
        Ok(())
    }
}

impl BOMReader for FileBOMReader {
    fn has_bom(&self) - > bool {
        self.bom.is_some()
    }

    fn read_content(&mut self) - > Result< String, std::io::Error > {
        if self.bom.is_none() {
            self.read_bom()?;
        }
        let mut buf = String::new();
        self.file.read_to_string(&mut buf)?;
        if self.has_bom() {
            match &self.bom {
                Some(bom) if bom.starts_with([0xEF, 0xBB, 0xBF].as_ref()) = > {
                    buf.drain(..3);
                }
                Some(bom) if bom.starts_with([0xFF, 0xFE].as_ref()) = > {
                    buf = buf.as_bytes().chunks_exact(2).map(|c| c[1]).collect();
                }
                Some(bom) if bom.starts_with([0xFE, 0xFF].as_ref()) = > {
                    buf = buf.as_bytes().chunks_exact(2).map(|c| c[0]).collect();
                }
                Some(bom) if bom.starts_with([0x00, 0x00, 0xFE, 0xFF].as_ref()) = > {
                    buf = buf.as_bytes().chunks_exact(2).skip(2).map(|c| c[1]).collect();
                }
                Some(bom) if bom.starts_with([0xFF, 0xFE, 0x00, 0x00].as_ref()) = > {
                    buf = buf.as_bytes().chunks_exact(4).skip(1).flat_map(|c| &c[2..]).collect();
                }
                _ = > {}
            }
        }
        Ok(buf)
    }
}

該trait定義了一個(gè)BOMReader并提供了一個(gè)FileBOMReader的實(shí)現(xiàn),可檢測和讀取文件中的 BOM(Byte Order Mark)。BOM 通常用于標(biāo)識(shí)文件的編碼格式,因?yàn)槟承┚幋a格式的字符集在讀取時(shí)可能有不同的字節(jié)序。

示例代碼

use std::fs::File;
use std::io::{Read, Write};

fn main() {
    let mut file = File::create("test_utf8.txt").unwrap();
    let content = "Hello, World!n";
    file.write_all(content.as_bytes()).unwrap();
    let mut reader = FileBOMReader::new(File::open("test_utf8.txt").unwrap());
    let result = reader.read_content().unwrap();
    assert_eq!(result, content);

    let mut file = File::create("test_utf16be.txt").unwrap();
    let bom = [0xFE, 0xFF];
    file.write_all(&bom).unwrap();
    let content = "Hello, World!n";
    file.write_all(content.as_bytes()).unwrap();
    let mut reader = FileBOMReader::new(File::open("test_utf16be.txt").unwrap());
    let result = reader.read_content().unwrap();
    assert_eq!(result, content);

    let mut file = File::create("test_utf16le.txt").unwrap();
    let bom = [0xFF, 0xFE];
    file.write_all(&bom).unwrap();
    let content = "Hello, World!n";
    file.write_all(content.as_bytes()).unwrap();
    let mut reader = FileBOMReader::new(File::open("test_utf16le.txt").unwrap());
    let result = reader.read_content().unwrap();
    assert_eq!(result, content);

    let mut file = File::create("test_utf32be.txt").unwrap();
    let bom = [0x00, 0x00, 0xFE, 0xFF];
    file.write_all(&bom).unwrap();
    let content = "Hello, World!n";
 file.write_all(content.as_bytes()).unwrap();
    let mut reader = FileBOMReader::new(File::open("test_utf32be.txt").unwrap());
    let result = reader.read_content().unwrap();
    assert_eq!(result, content);

    let mut file = File::create("test_utf32le.txt").unwrap();
    let bom = [0xFF, 0xFE, 0x00, 0x00];
    file.write_all(&bom).unwrap();
    let content = "Hello, World!n";
    file.write_all(content.as_bytes()).unwrap();
    let mut reader = FileBOMReader::new(File::open("test_utf32le.txt").unwrap());
    let result = reader.read_content().unwrap();
    assert_eq!(result, content);
}

通過編寫這樣的例子,我們可以測試我們的代碼,確保它能正確地讀取各種類型的文件。

使用encoding_rs讀取帶BOM頭的文件

在Rust中,可以使用std::fs::Filestd::io::BufReader模塊讀取文件,并使用encoding_rs模塊解析BOM頭以獲取文件的編碼信息。

use std::fs::File;
use std::io::BufReader;
use encoding_rs::Encoding;

fn main() {
    let filename = "example.txt";
    let file = File::open(filename).unwrap();
    let mut reader = BufReader::new(file);

    // 按照Utf8讀取文件    let decoder = Encoding::utf8().new_decoder_with_bom_handling();
    let (result, _, _) = decoder.decode(&mut reader);
 match result {
        Some(s) = > {
            println!("Content: {}", s);
        }
        None = > {
            println!("Error decoding file");
        }
    }
}

這個(gè)示例使用了Utf8編碼格式,但是在實(shí)現(xiàn)中使用了new_decoder_with_bom_handling()函數(shù)以自動(dòng)檢測和處理BOM頭。

如果需要支持其他編碼類型,則需要使用不同的編碼器(比如GBK)和相應(yīng)的 decoder。

// 按照GBK讀取文件
let decoder = Encoding::GBK.new_decoder_with_bom_handling();
// 解碼
let (result, _, _) = decoder.decode(&mut reader);

根據(jù)具體的編碼類型來選擇對(duì)應(yīng)的編碼器,就可以正常讀取文件內(nèi)容了。

總結(jié)

以上是在Rust語言中操作文件的實(shí)際應(yīng)用示例,涵蓋了文件讀取、追加寫入、重命名和移動(dòng)、復(fù)制、寫入、獲取元數(shù)據(jù)等操作。這些操作非常基礎(chǔ),但往往也是程序開發(fā)中必不可少的操作。在以后的程序開發(fā)中,讀者可以根據(jù)需求將這些操作進(jìn)行各種組合,以實(shí)現(xiàn)更為復(fù)雜的文件操作需求。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1942

    瀏覽量

    34707
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4327

    瀏覽量

    62573
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2108

    瀏覽量

    73623
  • rust語言
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    3009
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    228

    瀏覽量

    6601
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    何在Go中操作文本文件

    作為一種編程語言,Go 具有廣泛的內(nèi)置功能,包括創(chuàng)建、讀取和寫入文本(.txt)文件文件的功能。 文件是現(xiàn)代世界我們?nèi)粘I畹闹匾M成部分。文本文件對(duì)于存儲(chǔ)結(jié)構(gòu)化的人類可讀數(shù)據(jù)非常有
    發(fā)表于 09-29 09:48 ?763次閱讀

    何在Rust中使用Memcached

    Memcached是一種高性能、分布式的內(nèi)存對(duì)象緩存系統(tǒng),可用于加速動(dòng)態(tài)Web應(yīng)用程序。Rust是一種系統(tǒng)級(jí)編程語言,具有內(nèi)存安全、高性能和并發(fā)性等特點(diǎn)。Rust語言的Memcached庫提供了
    的頭像 發(fā)表于 09-19 16:30 ?1238次閱讀

    Rust語言如何與 InfluxDB 集成

    Rust 是一種系統(tǒng)級(jí)編程語言,具有高性能和內(nèi)存安全性。InfluxDB 是一個(gè)開源的時(shí)間序列數(shù)據(jù)庫,用于存儲(chǔ)、查詢和可視化大規(guī)模數(shù)據(jù)集。Rust 語言可以與 InfluxDB 集成,提供高效
    的頭像 發(fā)表于 09-30 16:45 ?1153次閱讀

    何在Rust中連接和使用MySQL數(shù)據(jù)庫

    何在Rust中連接和使用MySQL數(shù)據(jù)庫。 安裝 mysql 模塊 這里我們假設(shè)你已經(jīng)安裝了Rust編程語言工具鏈,在本教程中,我們將使用 mysql crate來連接和使用MySQL數(shù)據(jù)庫。要安裝
    的頭像 發(fā)表于 09-30 17:05 ?1667次閱讀

    何在Rust中讀寫文件

    見的內(nèi)存安全問題和數(shù)據(jù)競爭問題。 在Rust中,讀寫文件是一項(xiàng)非常常見的任務(wù)。本教程將介紹如何在Rust中讀寫文件,包括基礎(chǔ)用法和進(jìn)階用法。
    的頭像 發(fā)表于 09-20 10:57 ?2035次閱讀

    電氣CAD文件中高效的工作流程

    電氣CAD文件中高效的工作流程性能卓越的 PCschemetic ELautomation軟件具有作電氣設(shè)計(jì)時(shí)所需要的所有功能。其獨(dú)一無二的工作流程可節(jié)省您大量的時(shí)間,它代替了所有的訂貨信息——從
    發(fā)表于 12-04 11:24

    STM32F407使用FatFS,發(fā)現(xiàn)跟文件夾相關(guān)函數(shù)命令都可操作,但不能操作文件的函數(shù)

    STM32F407使用FatFS,發(fā)現(xiàn)跟文件夾相關(guān)函數(shù)命令都可操作,就是不能操作文件的函數(shù),請(qǐng)問這是為什么?
    發(fā)表于 12-17 08:48

    只會(huì)用Python?教你在樹莓派上開始使用Rust

    和不同的操作系統(tǒng)可能會(huì)產(chǎn)生不同的結(jié)果,它也可以通過遠(yuǎn)程SSH連接正常運(yùn)行。如何在Raspberry Pi上安裝Rust要安裝rust,請(qǐng)轉(zhuǎn)到rust
    發(fā)表于 05-20 08:00

    何在STM32 (Cortex M3)和GD32(RISC-V)上用Rust開發(fā)

    研發(fā)自己的操作系統(tǒng)。Rust 的官方主頁標(biāo)語就是 reliable and efficient,吉祥物也是硬殼的螃蟹,自然就有人想到把 Rust 應(yīng)用到安全可靠的嵌入式。嵌入式的特點(diǎn)就在于指令集
    發(fā)表于 06-21 10:38

    Rust開發(fā)操作系統(tǒng)教程之如何自制一個(gè)操作系統(tǒng)

    正如標(biāo)題,這篇文章是關(guān)于如何用Rust開發(fā)一個(gè)船新的操作系統(tǒng),而這個(gè)操作系統(tǒng)只會(huì)打印一句話: Hello World 在這之前,我們需要了解有關(guān)計(jì)算機(jī)底層的基礎(chǔ)知識(shí),包括IO、接口、網(wǎng)絡(luò)底層等等
    發(fā)表于 06-05 17:51 ?0次下載
    <b class='flag-5'>Rust</b>開發(fā)<b class='flag-5'>操作</b>系統(tǒng)教程之如何自制一個(gè)<b class='flag-5'>操作</b>系統(tǒng)

    自己改動(dòng)過的MP3制作文件資料合集

    自己改動(dòng)過的MP3制作文件資料合集
    發(fā)表于 01-11 09:08 ?3次下載

    WeLink協(xié)作文檔,高效協(xié)同辦公的重要選擇

    WeLink協(xié)作文檔,高效協(xié)同辦公的重要選擇 一直以來,打工人都在追求更高的辦公效率,以期達(dá)到事半功倍的效果。尤其是新冠疫情期間,不少人的出行和工作都受到了影響,很多上班族被迫在家辦公,線上辦公也
    的頭像 發(fā)表于 10-11 20:51 ?868次閱讀
    WeLink協(xié)<b class='flag-5'>作文</b>檔,<b class='flag-5'>高效</b>協(xié)同辦公的重要選擇

    華為云WeLink協(xié)作文檔,助您開啟職場高效辦公

    最新審核版本,最后可能還要找回第一版。想解決反復(fù)傳送文件的痛苦、遠(yuǎn)程體驗(yàn)同步溝通的高效,華為云WeLink協(xié)作文檔可以幫到你。 1)免轉(zhuǎn)換,全面兼容office Welink協(xié)作文檔是
    的頭像 發(fā)表于 12-14 11:37 ?989次閱讀
    華為云WeLink協(xié)<b class='flag-5'>作文</b>檔,助您開啟職場<b class='flag-5'>高效</b>辦公

    何在Linux中高效運(yùn)行終端命令

    Linux 終端是一個(gè)功能強(qiáng)大的工具,允許您使用命令執(zhí)行各種系統(tǒng)操作文件操作、程序管理和服務(wù)自動(dòng)化是您可以使用 shell 命令高效執(zhí)行的一些操作
    的頭像 發(fā)表于 03-20 09:39 ?716次閱讀

    何在Linux中高效運(yùn)行終端命令

    Linux 終端是一個(gè)功能強(qiáng)大的工具,允許您使用命令執(zhí)行各種系統(tǒng)操作文件操作、程序管理和服務(wù)自動(dòng)化是您可以使用 shell 命令高效執(zhí)行的一些操作
    的頭像 發(fā)表于 04-13 10:34 ?675次閱讀
    主站蜘蛛池模板: 国产午夜精品一区二区理论影院| 99国产这里只有精品视频| 久久欧洲视频| 岛国片在线看| 伊人久久大香线蕉综合亚洲| 青年医生插曲| 李亚男三级| 搞基福利社| 999精品国产人妻无码系列| 亚洲精品AV无码重口另类| 欧美fxxx| 精品爽爽久久久久久蜜臀| 国产成人在线视频观看| 51国产午夜精品免费视频| 亚洲国产欧美另类| 色偷拍自怕亚洲在线| 欧美高清videossexo| 久久精品国产免费播高清无卡| 亚洲欧美激情精品一区二区| 日本超A大片在线观看| 快穿女主有名器的H纯肉黄暴拉文 快插我我好湿啊公交车上做 | 老人洗澡自拍xxx互摸| 国产亚洲精品影视在线| 超碰97超碰在线视频哦| 97在线免费观看视频| 中文字幕无线观看不卡网站| 亚洲黄色大片| 亚洲 成人网| 玩50岁四川熟女大白屁股直播| 青娱乐极品视觉盛宴国产视频| 美美哒高清在线播放8| 久久99国产综合精品AV蜜桃| 国内精自品线一区91| 国产精品久久久久成人免费| 成人国产在线看不卡| WWW国产精品内射老师| 99国产在线精品观看二区| 91麻豆精品国产一级| 4480yy午夜私人影院| 97成人碰碰在线人妻少妇| 国产精品久久久久久搜索|