DOBON.NET どぼん!のVB道掲示板(プログラム)過去ログ

読み取り専用フォルダ、ファイルへの操作について

みなさん、はじめまして。

現在、勉強をかねて簡単なバックアップアプリを作成しています。
機能は元フォルダから先フォルダへのコピーをFSOをつかってコピーしています。
先フォルダに何もないときはいいのですが、同じフォルダ、ファイルがある場合で
読み取り専用が存在する時に上書きするとエラーが出ます。

現状考えているのは、上書き前に属性を変更して上書きすればいけそうですが
Windows上で行うようにフォルダ内全部を一回で属性変更できますでしょうか?

また、別の方法としましては、
一度先フォルダ内を削除してからと思いましたが
これも読み取り専用ではエラーなってしまいます。

その他、何かヒントになりそうなこと等ございましたらおしえてください。

どうぞよろしくお願いします。
こんちは、Kamaliと言います。よろしく。
.netでないから、これはVB6の話かな?

>みなさん、はじめまして。
>
>現在、勉強をかねて簡単なバックアップアプリを作成しています。
>機能は元フォルダから先フォルダへのコピーをFSOをつかってコピーしています。
>先フォルダに何もないときはいいのですが、同じフォルダ、ファイルがある場合で
>読み取り専用が存在する時に上書きするとエラーが出ます。
>

FSO?? まあ、それは置いておいて・・・

>現状考えているのは、上書き前に属性を変更して上書きすればいけそうですが
>Windows上で行うようにフォルダ内全部を一回で属性変更できますでしょうか?

「エクスプローラみたいに」ってことですね。

>また、別の方法としましては、
>一度先フォルダ内を削除してからと思いましたが
>これも読み取り専用ではエラーなってしまいます。
>
>その他、何かヒントになりそうなこと等ございましたらおしえてください。
>
>どうぞよろしくお願いします。

バックアップということでいくと、まずパックアップ先を空にしないとダメなんでしょうけど、それは結構ムズイので、一気に属性変更する方法をお教えしましょう。

そんな方法はない・・・けれど、ある。基本的には対象フォルダ内の全ファイルを列挙して、一つ一つ属性変更するしかないです。エクスプローラはそれをやってくれているだけで、そんなことをいっぺんにするAPIなどは用意されていません。

でも、方法はある。MS−DOSのコマンドに「ATTRIB」というのがあります。こいつのヘルプを見ると、、、

C:\WINDOWS>attrib /?
ファイル属性(アトリビュート)を表示したり, 変更します.

ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [[ドライブ:][パス]ファイル名] [/S]

+ 属性を設定します.
- 属性を解除します.
R 読み取り専用属性.
A アーカイブ属性.
S システムファイル属性.
H 隠しファイル属性.
/S 指定されたパスのすべてのディレクトリのファイルを処理します.

というわけで、ファイル名にワイルドカード「*.*」を使えば指定フォルダ以下を一気に属性変更できます。例えば、

ATTRIB −R C:¥BACKUP¥*.* /S

とか。だから、VBからShell関数(VB6, VB.NETで違うと思います。VB6での正式な関数名は忘れてしまいました)を使って、このコマンドを実行させればいいわけです。でも、様々課題もありますよ。Shell関数では処理を非同期に実行するので、関数からはすぐにリターンしますが、処理がいつ終ったか分りません。CreateProcess()やWaitSingleObject(だったかな?)というようなAPIを使えば終るまで待っていられますが、、、ムズイです、VBでは。

ではでは、健闘を祈ります。
>こんちは、Kamaliと言います。よろしく。
>.netでないから、これはVB6の話かな?
おはようございます、Kamaliさん。
お返事ありがとうございます。
現在VB.NETのほうで作成しています。
早速、結果からですが、ばっちりうまくいきました!

>FSO?? まあ、それは置いておいて・・・
すみませんFileSystemObjectでした。

>バックアップということでいくと、まずパックアップ先を空にしないとダメなんでしょうけど、それは結構ムズイので、一気に属性変更する方法をお教えしましょう。
>
>そんな方法はない・・・けれど、ある。基本的には対象フォルダ内の全ファイルを列挙して、一つ一つ属性変更するしかないです。エクスプローラはそれをやってくれているだけで、そんなことをいっぺんにするAPIなどは用意されていません。

そうですね、私も最悪ひとつずつ枝分かれして・・・とやっていくしかないかなと思っていました。

>でも、方法はある。MS−DOSのコマンドに「ATTRIB」というのがあります。
Dosコマンドを使うとは思いつきませんでした・・。
Dosコマンドの投げ方もこちらのサイトを参考にさせていただきました。
後はデータ量による負荷等のテストも行ってみます。

>ではでは、健闘を祈ります。

今回は的を得た回答を下さって本当にお世話になりました。
次はファイルの監視等にも挑んでみようと思います(私には無理そうですが・・・)。
では、ありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板