nodejs 實現文件拷貝

通過4中不通的方式實現對一個文件的拷貝

方式一:readFile 異步一次性讀取文件再寫入

//異步形式讀取文件
function copyFile(url){const extName = path.extname(url)const fileName = path.basename(url)const dirName = path.dirname(url)fs.readFile(url, (err, data) => {fs.writeFile(`${dirName}/${fileName}_copy_1${extName}`, data , err => {if(err){console.log(`寫入出現錯誤 ${err.toString()}`)}else{console.log('完成!')}})})
}

方式二:readFileSync 同步一次性讀取文件再寫入

//同步形式讀取文件
function copySync(url){const extName = path.extname(url)const fileName = path.basename(url)const dirName = path.dirname(url)var data = fs.readFileSync(url)    fs.writeFileSync(`${dirName}/${fileName}_copy_1${extName}`,data)console.log('同步拷貝完成!')
}

方式三:使用流邊讀邊寫

const fs = require('fs')
const path = require('path')// 使用流拷貝
function streamCopyFile(url){const extName = path.extname(url)const fileName = path.basename(url)const dirName = path.dirname(url)let options = {highWaterMark : 64 * 1024 //默認值,每個chunk的大小
    }const readable = fs.createReadStream(url, options)const writable = fs.createWriteStream(`${dirName}/${fileName}_copy${extName}`)var size = 0var totalSize = 0const stat = fs.stat(url, (err , stats) => {totalSize = stats.size})readable.on('open', () => {console.log('打開文件');})readable.on('data', data => {size = data.length + sizeconsole.log('已完成 ' + parseInt((size / totalSize) * 100) + '%');writable.write(data)readable.pause()})readable.on('end', () => {console.log('讀取完成')})readable.on('error', err => {console.log(`讀取時出現錯誤 ${err.toString()}`)})writable.on('error', err => {console.log(`寫入時出現錯誤 ${err.toString()}`)})//將內存中數據全部寫入文件后觸發 drain 事件writable.on('drain', () => {readable.resume()})writable.on('finish', () => {console.error('寫入完成');})
}

方式四:使用pipe

//通過管道的方式
function pipeCopyFile(url){const extName = path.extname(url)const fileName = path.basename(url)const dirName = path.dirname(url)const readable = fs.createReadStream(url)const writable = fs.createWriteStream(`${dirName}/${fileName}_copy_2${extName}`)var size = 0var totalSize = 0const stat = fs.stat(url, (err , stats) => {totalSize = stats.size})writable.on('pipe', (src) => {console.log('有數據正通過管道流入寫入器')})writable.on('finish', () => {console.error('寫入已完成')})readable.pipe(writable)
}

方法一和方法二使用起來簡單,但是在操作大文件時對內存壓力大,不推薦讀取大文件使用

另外如果需要對文件制定塊進行讀取和寫入請使用read 、write 兩個方法

轉載于:https://www.cnblogs.com/xiaoliwang/p/10095623.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450032.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

國家部委對4G調研:未定給中電信聯通發放牌照

一場有關4G牌照發放的論戰正在發酵,矛盾的核心在于,除了中移動外,政府是否也會向中電信和聯通發放TD-LTE(中國主導的4G標準)牌照 記者 王云輝 雍忠瑋 一場圍繞4G的新博弈已經白熱化。 “多個國家部委正在對4G展開全面調研,但最終如…

Luogu4735 最大異或和

題目藍鏈 Description 給你一個序列,你需要支持以下兩個操作: A x: 在序列尾部添加一個整數\(x\),序列的長度增加\(1\)Q l r x: 詢問操作,你需要找到一個位置\(p \in [l, r]\),使得:\(x \bigoplus a_p \big…

Spring-jdbc:JdbcTemplate使用簡介

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 為了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定義了一個抽象層, 以此建立一個JDBC存取框架. 作為 SpringJDBC 框架的核心, JDBC 模板…

Java多線程編程:變量共享分析(Thread)

Java多線程編程:變量共享分析(Thread) Java 創建線程的兩種方法 此處只簡單講下自己對java多線程變量共享的理解: 按照進程和多線程的原理,同一進程內的多個線程之間的地址空間是共享的(除去ThreadLocal&a…

嘉益仕(Litns)帶您讀懂MES系統:選型篇

自從智能制造概念提出以來,制造執行系統MES在國內掀起了新一波的熱潮。眾多企業在技術發展、政策導向和自身需要的推動下,紛紛上馬MES請添加鏈接描述項目。 由此也帶動了MES軟件開發企業的快速發展。一夜之間MES軟件開發企業遍地開花,MES產品…

[WPF]xml序列化以及反序列化數據

代碼 XML序列化工具類 public static class XMLHelper{/// <summary>/// 將對象序列化為指定的文件名/// </summary>/// <typeparam name"T"></typeparam>/// <param name"obj"></param>/// <param name"fil…

多線程的那點兒事

1. 多線程的那點兒事&#xff08;基礎篇&#xff09; 多線程編程是現代軟件技術中很重要的一個環節。要弄懂多線程&#xff0c;這就要牽涉到多進程&#xff1f;當然&#xff0c;要了解到多進程&#xff0c;就要涉及到操作系統。不過大家也不要緊張&#xff0c;聽我慢慢道來。…

Android應用開發—AsyncTask

摘錄自 Android 多線程—–AsyncTask詳解 AsyncTask AsyncTask&#xff1a;異步任務&#xff0c;從字面上來說&#xff0c;就是在我們的UI主線程運行的時候&#xff0c;異步的完成一些操作。AsyncTask允許我們的執行一個異步的任務在后臺。我們可以將耗時的操作放在異步任務當…

std::shared_ptr之deleter的巧妙應用

本文由作者鄒啟文授權網易云社區發布。std::shared_ptr一次創建&#xff0c;多處共享&#xff0c;通過引用計數控制生命周期。 實例 在郵箱大師PC版中&#xff0c;我們在實現搜索時&#xff0c;大致思路是這樣的&#xff1a; 每一個賬號都有一個SearchFlow&#xff0c;搜索開始…

js - 執行上下文和作用域以及閉包

首先&#xff0c;咱們通常被"執行上下文"&#xff0c;"執行上下文環境"&#xff0c;"上下文環境"&#xff0c;"執行上下文棧"這些名詞搞混。那我們一一來揭秘這些名字的含義。 這一塊一直比較晦澀難懂&#xff0c;還是需要仔細去斟酌斟…

Spring之JDBCTemplate

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、Spring對不同的持久化支持&#xff1a; Spring為各種支持的持久化技術&#xff0c;都提供了簡單操作的模板和回調 ORM持久化技術模…

從螞蟻金服實踐入手,帶你深入了解 Service Mesh

本文整理自螞蟻金服高級技術專家敖小劍在 QCon 上海 2018 上的演講。我是來自螞蟻金服中間件團隊的敖小劍&#xff0c;目前是螞蟻金服 Service Mesh 項目的 PD。我同時也是 Servicemesher 中國技術社區的創始人&#xff0c;是 Service Mesh 技術在國內最早的布道師。我今天給大…

Android應用開發—FragmentManager如何管理fragments

本文主要摘錄自Android中使用FragmentManager管理fragments 和 淺談FragmentManager與fragment之一二事 先講下自己對fragment的理解&#xff1a; 對于fragment&#xff0c;有太多官方文檔和博文來介紹&#xff0c;此處不做轉述&#xff1a;我感覺android提供fragment這種組件…

數組指針 和 指針數組

最近發現公司有些人說怎樣區分 數組指針 和 指針數組 &#xff1f; 其實 很簡單&#xff1b; 數組指針&#xff0c; 先是&#xff08;定語 &#xff09; &#xff08;主體&#xff09;&#xff0c; &#xff08;定語 數組&#xff09; &#xff08;主體 指針&#xff09…

在云服務器上注意GeoServer和ShadowDataMap的跨域設置

在云服務器上注意GeoServer和ShadowDataMap的跨域設置 1、對于支持cors的網絡資源 可以在ShadowDataMap的devserverconfig.json里設置相應的跨域資源 提示&#xff1a;geoserver發布的地圖服務雖然同在一個服務器上&#xff0c;但是端口不一樣&#xff0c;同樣需要設置跨域 如&…

Guava ImmutableCollection簡介

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 ImmutableCollection代碼定義 GwtCompatible(emulatedtrue) public abstract class ImmutableCollection<E> extends AbstractCo…

Todo List

fragment里面如何處理back按鍵事件。 fragment里面無法Override onBackPressed接口&#xff0c;如何優雅的處理back press事件&#xff1f;activity如何獲取當前活躍的fragment對象。異步網絡請求如何改造成rxjava&#xff0c;rxjava有設置運行線程的能力&#xff0c;異步請求…

常見的幾種負載均衡算法

1、輪詢將所有請求&#xff0c;依次分發到每臺服務器上&#xff0c;適合服務器硬件相同的場景。優點&#xff1a;服務器請求數目相同&#xff1b; 缺點&#xff1a;服務器壓力不一樣&#xff0c;不適合服務器配置不同的情況&#xff1b; 2、隨機請求隨機分配到各臺服務器上。優…

基于 Token 的身份驗證方法

基于 Token 的身份驗證方法 使用基于 Token 的身份驗證方法&#xff0c;在服務端不需要存儲用戶的登錄記錄。大概的流程是這樣的&#xff1a;客戶端使用用戶名跟密碼請求登錄 服務端收到請求&#xff0c;去驗證用戶名與密碼 驗證成功后&#xff0c;服務端會簽發一個 Token&…