Backpupデータ用のスクリプトを作成するプロセスを引き続き説明します。
前の記事で、変更されたファイルのリストを定義する機能を作成しました(そして書き直しました)。 現時点では、変更されたデータのファイルを作成するプロセスについて説明します。
ファイルアーカイブの作成
この場合の変更されたデータは、変更されたファイルとディレクトリです(それらは追加/削除できます)。 したがって、変更されたデータのファイルは、本質的にアーカイブになります。 アーカイブを作成するとき、2つの方法があります-
- 各ファイルを個別にパックする
- すべてのファイルをまとめてパックする
- 混合戦略:すべてのファイルを1つの拡張子でパックできます
オプション2はあまり最適ではありません。アーカイブに.gifおよび.txtファイルを追加する必要がある場合、.gifをパックすると、その中のデータが既にパックされているという事実のためにサイズが増加します。テキストファイルは十分に圧縮されており、ファイルを解凍したままにしておくと、圧縮時に取得できるサイズを失います。
オプション1と3があります-そのうち、実装が簡単なので、最初のオプションを選択しました。
また、アーカイブがYandexディスクなどの外部リソースに保存され、データが盗まれるのを恐れないように、アーカイブでファイル暗号化を行います。 :)
アーカイブの概要を説明します

写真では、私の意見では、すべてが十分に明確であるため、アーカイブの形式を詳細に説明しません。
stream.Transformストリームを使用した暗号化とパッケージ化
暗号化とパッケージ化の方法に移りましょう。 これを行うには、
stream.Transformクラスを使用します。 このクラスのタイプはDuplex-つまり 彼はデータを読み書きできます。 _transform関数をオーバーライドして、必要に応じてデータを変換(暗号化/復号化、パック/アンパック)できます。
簡単にするために、XOR操作による暗号化クラスの例を作成します。
すべてが非常に簡単です
-stream.Transformクラスからクラス継承を作成し、次のパラメーターを持つ
_transformメソッドを定義します
- chunk-変換するデータのチャンク
- enc-エンコード
- cbはコールバック関数です。 処理が完了すると呼び出されます。
暗号化モジュールは2つの関数を返す必要があります
- createCipher-暗号化用のクラスを作成する関数
- createDecipher-復号化用のクラスを作成する関数
XOR操作は対称的であるため(つまり、復号化の場合、暗号化の場合と同じ操作を実行するだけで十分です)、私の場合、両方の関数が同じクラスを返します。
暗号化のための自作クラスの例を挙げました。 プログラムでは、標準の暗号化クラス(
暗号化
ストリーム )とパッケージ化(
zlibストリーム )を使用します。
パッケージ化機能は「packer」フォルダーに、暗号化機能は「crypto」フォルダーにあります。
ストレージを操作する
これは、ストレージリンク[ストレージ
タイプ ://] [
ストレージアドレス ]の外観です。
ストレージを操作するモジュールには2つのメソッドが含まれている必要があります
- put ( url 、 filename 、 rs 、 コールバック(err) )-rsデータストリームをストレージに書き込むためのメソッド
- url-ストレージアドレス
- filename-ファイル名
- rs-データを読み取るためのストリーム
- コールバック(err) -コールバック関数。 操作が完了した後に呼び出されます。
- get ( url 、 filename 、 ws 、 callback(err) )-リポジトリからwsストリームにファイルを読み込むためのメソッド
- url-ストレージアドレス
- filename-ファイル名
- ws-データを書き込むためのストリーム
- コールバック(err) -コールバック関数。 操作が完了した後に呼び出されます。
この場合、ストレージアドレスはメソッドに転送されます(つまり、ストレージのタイプはメソッドに転送されません)。
すでに書かれたモジュールから最終プログラムを収集することは残っています。
最も一般的な間違い
そして、NodeJSでプログラムを作成する際の(私の経験上)最も一般的な間違いについて個別に書きたいと思い
ます 。NodeJS
の関数がASYNCHRONOUSであることを忘れないでください 。 特に、stream.close()ストリームメソッドが非同期であることを忘れていました。 だから私は閉じて、すぐにファイルを使い始めました。 時々それは機能しました(ファイルは閉じられました)、そして時にはそうではありません-そして、私はそれを操作するときにゼロの長さとエラーのファイルを受け取りました。 クローズイベントをキャッチして、そのイベントで作業を続ける必要がありました。
私の間違いを繰り返さないでください !
すべてのソースコードへのリンク -これらは、記事で言及されている(言及されていない)すべてのソースコードです
:バックアップデータ用NodeJSのスクリプト :開始 、
バックアップデータ用NodeJSのスクリプト:終了メーカーのウェブサイトでヘルププログラムをダウンロードするためのリンクは、最終的なプログラムへのリンクです。 ソースコードとは異なり、このアーカイブのデータは変更されます。 特に、FTPおよびyandex-diskのサポートを追加する予定です。 現在、ファイルシステムでの作業はストレージとしてサポートされています。 指定したフォルダーで保存が行われます。