C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: ファイルのコピーで失敗してしまいます。


(過去ログ 106 を表示中)

[トピック内 20 記事 (1 - 20 表示)]  << 0 >>

■63365 / inTopicNo.1)  ファイルのコピーで失敗してしまいます。
  
□投稿者/ 裕猫 (6回)-(2012/08/21(Tue) 09:56:22)

分類:[C#] 

Windows7 32bit pro
VisualStudio2010 C#
サーバーのバックアップをとるのに
string[] files = Directory.GetFiles(@"\\svr1\F$\HIMITU", "*", SearchOption.AllDirectories);
string pas, horder;
string user = Environment.UserDomainName + "\\" + Environment.UserName;
FileSystemAccessRule fsaRule = new FileSystemAccessRule(user, FileSystemRights.FullControl, AccessControlType.Allow);
FileSecurity security;

for (int CT1 = 0; CT1 < files.Length; CT1++)
{
FileAttributes fas = File.GetAttributes(files[CT1]);
if ((fas & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{
fas = fas & ~FileAttributes.ReadOnly;
File.SetAttributes(files[CT1], fas);
}

pas = Drive + ":\\" + HI + "\\F" + files[CT1].Substring(9);
horder = Path.GetDirectoryName(pas);
Console.WriteLine(files[CT1] + "---->" + pas);
if (Directory.Exists(horder) == false) { Directory.CreateDirectory(horder); }

security = File.GetAccessControl(files[CT1]);
security.AddAccessRule(fsaRule);
File.SetAccessControl(files[CT1], security);

File.Copy(files[CT1], pas, true);

security.SetAccessRuleProtection(true, true);
security.PurgeAccessRules(new NTAccount(user));
File.SetAccessControl(files[CT1], security);
}
としてHIMITUホルダーの中のファイル名を全部取得し、セキュリティを解除してコピーし、コピー後セキュリティを元に戻しています。
最初のうちはうまくいっていたのですがある日から突然セキュリティエラーでコピーが止まってしまうようになってしましました。
どうやらなにか変なデータがサーバー内にできたようですが80GBもあるデータの中のどれが悪いかなんてどうやって調べればいいんじゃーとなってしましました。
このプログラムのどこをどう直せばセキュリティに影響されずに全てのファイルをコピーできるでしょう?お知恵をお貸しください。
よろしくお願いいたします。m(_ _)m

引用返信 編集キー/
■63368 / inTopicNo.2)  Re[1]: ファイルのコピーで失敗してしまいます。
□投稿者/ shu (38回)-(2012/08/21(Tue) 10:48:20)
No63365 (裕猫 さん) に返信

ファイル名の取得がすべて出来ているとしたら
半分づつしぼって(カウントしてスキップする)該当ファイルを突き詰めて
どんなセキュリティが影響しているのか限定するとよいかと思います。
引用返信 編集キー/
■63385 / inTopicNo.3)  Re[1]: ファイルのコピーで失敗してしまいます。
□投稿者/ 魔界の仮面弁士 (28回)-(2012/08/21(Tue) 16:51:02)
コード投稿時は、[図表モード]のご利用をお願いします。m(_ _)m


No63365 (裕猫 さん) に返信
> string[] files = Directory.GetFiles(@"\\svr1\F$\HIMITU", "*", SearchOption.AllDirectories);
SearchOption.AllDirectories 指定の場合、下位の層にアクセスできないパスがあると
UnauthorizedAccess 等の Exception が発生し、その時点で列挙が中止されてしまいます。
http://msdn.microsoft.com/ja-jp/library/bb513869.aspx


アクセス権が問題になるような場所に対しては、TopDirectoryOnly 指定にして
ディレクトリー直下のファイルのみを列挙するようにし、
Directory.GetDirectories と Directory.GetFiles を再帰的に呼び出した方が
より多くのファイル群を拾い出すことができます。
途中で例外が起きた場所に対して、try 〜 catch で対処するコードは必要ですけれども。


> セキュリティを解除してコピーし、コピー後セキュリティを元に戻しています。
その処理だと、セキュリティの変更権限も必要になりそうですが、その点は大丈夫でしょうか。

そもそもバックアップが目的なら、一つ一つのファイルの ACL を一時的に書き換えるよりも、
各ファイルにアクセス可能なバックアップ専用アカウントを一つ用意しておき、
アプリをそのアカウントの実行権限で実行させるわけにはいかないのでしょうか。


> どれが悪いかなんてどうやって調べればいいんじゃーとなってしましました。
Exception を拾って、その内容(例外の型、Message、StackTrace 等)を記録しては如何でしょう。

サイズが大きいので調査に時間はかかるかと思いますが、バックアップ系の処理なので、
正常系/失敗系の判定処理や検証は十二分に行っておかないと、後でリカバリーの時点になって
バックアップが失敗していて困り果てる、なんて事態にもなりかねませんし。



―― 以下、本題とは関係ないところで:

> としてHIMITUホルダーの中のファイル名を全部取得し、
ホルダー(holder)ではなく
フォルダー(folder)ですね。

> string pas, horder;
ファイルの所在を示す文字列ならば、pas ではなく path だと思います。
horder は… folder のことでしょうか。
引用返信 編集キー/
■63390 / inTopicNo.4)  Re[2]: ファイルのコピーで失敗してしまいます。
□投稿者/ 裕猫 (7回)-(2012/08/22(Wed) 09:43:08)
No63368 (shu さん) に返信
> ファイル名の取得がすべて出来ているとしたら
> 半分づつしぼって(カウントしてスキップする)該当ファイルを突き詰めて
> どんなセキュリティが影響しているのか限定するとよいかと思います。
いつもお世話になります。ファイル名は全て取得できているはずです。バックアップ後のファイル数を比べたところ以前正常にできた時は一致していました。またプログラムは取得したファイル名に対してのみコピー指令をしているのでファイル名は取得できています。リストにはしてないのでリスト化するプログラム入れてみようと思います。
引用返信 編集キー/
■63391 / inTopicNo.5)  Re[2]: ファイルのコピーで失敗してしまいます。
□投稿者/ 裕猫 (8回)-(2012/08/22(Wed) 09:55:54)
No63385 (魔界の仮面弁士 さん) に返信
> コード投稿時は、[図表モード]のご利用をお願いします。m(_ _)m
はいすみませんでした。
>>string[] files = Directory.GetFiles(@"\\svr1\F$\HIMITU", "*", SearchOption.AllDirectories);
> SearchOption.AllDirectories 指定の場合、下位の層にアクセスできないパスがあると
> UnauthorizedAccess 等の Exception が発生し、その時点で列挙が中止されてしまいます。
> http://msdn.microsoft.com/ja-jp/library/bb513869.aspx
プログラムの動作は配列にファイル名取得後その配列にあるファイル名のものをコピーします。のでファイル名取得時にはエラーを起こしていません。その後のコピー命令実行中にエラーを起こします。

>>セキュリティを解除してコピーし、コピー後セキュリティを元に戻しています。
> その処理だと、セキュリティの変更権限も必要になりそうですが、その点は大丈夫でしょうか。
>
> そもそもバックアップが目的なら、一つ一つのファイルの ACL を一時的に書き換えるよりも、
> 各ファイルにアクセス可能なバックアップ専用アカウントを一つ用意しておき、
> アプリをそのアカウントの実行権限で実行させるわけにはいかないのでしょうか。
全てのファイルにアクセスできるアカウントで実行しています。

>>どれが悪いかなんてどうやって調べればいいんじゃーとなってしましました。
> Exception を拾って、その内容(例外の型、Message、StackTrace 等)を記録しては如何でしょう。
昨夜バックアップをしていてエラーを出しましたので書いておきます。

ハンドルされていない例外:System.InvalidOprerationException: メソッドが失敗し、予期しないエラーコード53が生成されました
 場所 System.Security.AccessControl.NativeObjectSecurity.Persist(String name,SafeHandle handle,AccessControlSections includeSection includeSections,Object exceptionContext)
 場所 System.Security.AccessControl.NativeObjectSecurity.Persist(String name,AccessControlSections includeSections,Object exceptionContext)
 場所 System.Security.AccessControl.NativeObjectSecurity.Persist(String name,AccessControlSections)
 場所 System.Security.AccessControl.FileSystemSecurity.Persist(String fullPath)
 場所 System.IO.File.SetAccessControl(String path,FileSecurity fileSecurity)
 場所 SB_F.Proguram.Main(String[] args)

この後
 SB_Fは動作を停止しました
 問題が発生したため、プログラムが正しく動作しなくなりました。プログラムは閉じられ、解決策がある場合はwindowsから通知されます。
というメッセージウィンドウが出ていました。 ボタンにはプログラムの終了しかないのでプログラムの終了をクリックし終了させました。

> ―― 以下、本題とは関係ないところで:
>
>>としてHIMITUホルダーの中のファイル名を全部取得し、
> ホルダー(holder)ではなく
> フォルダー(folder)ですね。
>
>>string pas, horder;
> ファイルの所在を示す文字列ならば、pas ではなく path だと思います。
> horder は… folder のことでしょうか。
folderとかpathは予約語としてある場合があるのでわざと変えて使うようにしています。
引用返信 編集キー/
■63393 / inTopicNo.6)  Re[3]: ファイルのコピーで失敗してしまいます。
□投稿者/ 魔界の仮面弁士 (31回)-(2012/08/22(Wed) 11:13:17)
No63391 (裕猫 さん) に返信
> があるのでわざと変えて使うようにしています。
Proguram といい pas といい、英語でもローマ字表記でも無い中途半端さで
なんかムズムズしますが…意図的にそうしているのであれば一応納得です。


> その後のコピー命令実行中にエラーを起こします。
バックアップ中にファイルI/Oが発生したり、ファイルの排他制御等々の理由で
バックアップ処理に失敗する可能性は常に付きまとうので、失敗したパスは記録しておき、
失敗したパスは処理を飛ばしてバックアップ処理を続行、すべて終わったところで
失敗分をリトライしてみて、それで駄目ならエラーログに記録…などの
追加対処が必要になることもあります。(既に実施済みなのかも知れませんが)


> 全てのファイルにアクセスできるアカウントで実行しています。
アクセス可能なアカウントで実行しているのであれば、ACL を書き換えずとも
コピーできそうな気がしますが、それはできないのでしょうか。


> 昨夜バックアップをしていてエラーを出しましたので書いておきます。
エラー時の fullPath も記録されていますか?


> というメッセージウィンドウが出ていました。
System.IO.File.SetAccessControl メソッドを呼び出しているところで、内部エラーが
発生しているみたいですね。File.SetAccessControl を呼び出している個所は
2 つありますが、どちらの行で発生したエラーか分かりますか?


> .InvalidOprerationException: メソッドが失敗し、予期しないエラーコード53が生成されました
セキュリティ識別子の割り当てを行うための SetSecurityInfo API の呼び出し時に、
| エラーコード 53 (ERROR_BAD_NETPATH)
| 「The network path was not found.
| 「ネットワーク パスが見つかりません。」
が返されているものと推察します。

一時的なネットワーク障害であるようにも見受けられますが、
OS のイベントログ等に、何か記録が残っていたりはしませんか?


http://support.microsoft.com/kb/415099/ja
http://answers.microsoft.com/ja-jp/windows/forum/windows_7-networking/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC/b8509c3d-c54e-e011-8dfc-68b599b31bf5?msgId=f9587a71-a14f-e011-8dfc-68b599b31bf5
http://support.microsoft.com/kb/910387/ja
引用返信 編集キー/
■63395 / inTopicNo.7)  Re[4]: ファイルのコピーで失敗してしまいます。
□投稿者/ 裕猫 (9回)-(2012/08/22(Wed) 14:15:17)
No63393 (魔界の仮面弁士 さん) に返信
> バックアップ中にファイルI/Oが発生したり、ファイルの排他制御等々の理由で
> バックアップ処理に失敗する可能性は常に付きまとうので、失敗したパスは記録しておき、
> 失敗したパスは処理を飛ばしてバックアップ処理を続行、すべて終わったところで
> 失敗分をリトライしてみて、それで駄目ならエラーログに記録…などの
> 追加対処が必要になることもあります。(既に実施済みなのかも知れませんが)
そのように作り直してみます。

> アクセス可能なアカウントで実行しているのであれば、ACL を書き換えずとも
> コピーできそうな気がしますが、それはできないのでしょうか。
そうなんですが実際にやってみたらコピーできないファイルが出てきまして、その対策の為に始めました。その後1月はちゃんと動いていたのですが、3ヶ月くらい前から突然またエラー停止するようになってしまって困っています。

> エラー時の fullPath も記録されていますか?
直前かエラーのファイルかは不明ですがwindowにコピーしているファイル名をfullpath表示させていたのでわかります。

> System.IO.File.SetAccessControl メソッドを呼び出しているところで、内部エラーが
> 発生しているみたいですね。File.SetAccessControl を呼び出している個所は
> 2 つありますが、どちらの行で発生したエラーか分かりますか?
これはどちらかはわかりません。夜中にバックアップさせているのでその時の状況がわかりません。ちなみに昼間だとバックアップできちゃうんですよね。業務プログラムの反応が鈍るので昼間はやめてくれといわれているのでできませんが。

> 一時的なネットワーク障害であるようにも見受けられますが、
> OS のイベントログ等に、何か記録が残っていたりはしませんか?
Windows2000ではLANが突然切れることがあることを知りました。 バックアップ取るのはWindows7ですが、サーバーがWindows2000serverでした。そのへんになにかあるのかもしれませんね。
OSのログイベントは見方を知らないので確認できません。調べてみます。
引用返信 編集キー/
■63397 / inTopicNo.8)  Re[5]: ファイルのコピーで失敗してしまいます。
□投稿者/ shu (41回)-(2012/08/22(Wed) 14:24:44)
No63395 (裕猫 さん) に返信

> これはどちらかはわかりません。夜中にバックアップさせているのでその時の状況がわかりません。ちなみに昼間だとバックアップできちゃうんですよね。業務プログラムの反応が鈍るので昼間はやめてくれといわれているのでできませんが。
他の業務で夜間バッチとか動いていませんか?そのプロセスでファイルをつかんでいてコピーできないとか?
引用返信 編集キー/
■63398 / inTopicNo.9)  Re[5]: ファイルのコピーで失敗してしまいます。
□投稿者/ 渋木宏明 (12回)-(2012/08/22(Wed) 15:57:41)
渋木宏明 さんの Web サイト
>>セキュリティを解除してコピーし、コピー後セキュリティを元に戻しています。
> その処理だと、セキュリティの変更権限も必要になりそうですが、その点は大丈夫でしょうか。

あと、ACL 変更した状態でアプリがクラッシュしたら最悪な気がしますが、仮に ACL を変更した状態でプログラムが停止しても大事無いんでしょうか?

> Windows2000ではLANが突然切れることがあることを知りました。 バックアップ取るのはWindows7ですが、サーバーがWindows2000serverでした。そのへんになにかあるのかもしれませんね。
> OSのログイベントは見方を知らないので確認できません。調べてみます。

対策を講じるには、まず問題の原因をきちんと把握することが重要だと思います。

OS 標準コマンドの ROBOCOPY なら操作失敗時のリトライ回数の指定ができたりしますが、そういった既存のツールを使うのではだめなんでしょうか?


引用返信 編集キー/
■63401 / inTopicNo.10)  Re[6]: ファイルのコピーで失敗してしまいます。
□投稿者/ 裕猫 (10回)-(2012/08/23(Thu) 08:49:01)
No63397 (shu さん) に返信
> 他の業務で夜間バッチとか動いていませんか?そのプロセスでファイルをつかんでいてコピーできないとか?
夜間はサーバーとバックアップ機のみ動いており、その他は全てシャットダウンしています。動いているバッチはありません。

昨日OSのログイベントが見れました。するとサーバーのシャットダウンの設定時刻にエラーが起こっているのに気付き、バックアップ完了前にサーバーがシャットダウンしている可能性に思い当たり、昨夜サーバーを0時まで起動するように設定しなおし、バックアップをかけてみました。すると23:15にエラーが出て止まっていました。
2つエラーが出ていて先に.Net Runtimeエラーが出て、その後Applicationエラーが出ていました。エラーの内容は

.Net Runtime
アプリケーション:SB_G.exe
フレームワークのバージョン: v4.0.30319
説明: ハンドルされない例外のため、プロセスが中止されました。
例外情報: System.IO.PathTooLongException
スタック:
場所 System.IO.Path.NormalizePath(System.String, Boolean, Int32)
場所 System.IO.Path.GetDirectoryName(System.String)
場所 SB_G.Program.Main(System.String[])

Application
障害が発生しているアプリケーション名: SB_G.exe、バージョン: 1.0.0.0、タイム スタンプ: 0x4fd1439a
障害が発生しているモジュール名: KERNELBASE.dll、バージョン: 6.1.7601.17651、タイム スタンプ: 0x4e2111c0
例外コード: 0xe0434352
障害オフセット: 0x0000d36f
障害が発生しているプロセス ID: 0x650
障害が発生しているアプリケーションの開始時刻: 0x01cd803a08e54e36
障害が発生しているアプリケーション パス: C:\MATUKO\SB_G.exe
障害が発生しているモジュール パス: C:\Windows\system32\KERNELBASE.dll
レポート ID: c6b564ab-ec63-11e1-a0b4-002522ac914a
という内容でした。
これってパスの名前の長さのエラーですかね?
引用返信 編集キー/
■63402 / inTopicNo.11)  Re[6]: ファイルのコピーで失敗してしまいます。
□投稿者/ 裕猫 (11回)-(2012/08/23(Thu) 08:55:11)
No63398 (渋木宏明 さん) に返信
> あと、ACL 変更した状態でアプリがクラッシュしたら最悪な気がしますが、仮に ACL を変更した状態でプログラムが停止しても大事無いんでしょうか?
そこのところに頭が回っていませんでした。見えていけない人に見えるようになるだけならうちの会社の場合そんな重要なデータがあるわけでなし、まあいいかと考えていました。

> OS 標準コマンドの ROBOCOPY なら操作失敗時のリトライ回数の指定ができたりしますが、そういった既存のツールを使うのではだめなんでしょうか?
費用がかからなければ全然OKなのでROBOCOPY調べて使ってみようかと思います。ありがとうございました。
引用返信 編集キー/
■63403 / inTopicNo.12)  Re[7]: ファイルのコピーで失敗してしまいます。
□投稿者/ オショウ (12回)-(2012/08/23(Thu) 09:03:16)
ROBOCOPY が、使えるなら・・・

Microsoft SyncFramework の、Sync Services for File Systems 使ったら
如何でしょう? 私は、それ使ってバックアップさせました。

あと、アプリではなく、サービスにするとか・・・
いろいろな対処をプログラムしないといけない部分を、提供されている機
能でカバーできてしまうので、コーディング量も減り、シンプルで確実に
動作するものができやすいと思いますが。

以上。参考まで
引用返信 編集キー/
■63404 / inTopicNo.13)  Re[7]: ファイルのコピーで失敗してしまいます。
□投稿者/ shu (42回)-(2012/08/23(Thu) 09:16:11)
No63401 (裕猫 さん) に返信

> 昨日OSのログイベントが見れました。するとサーバーのシャットダウンの設定時刻にエラーが起こっているのに気付き、バックアップ完了前にサーバーがシャットダウンしている可能性に思い当たり、昨夜サーバーを0時まで起動するように設定しなおし、バックアップをかけてみました。すると23:15にエラーが出て止まっていました。
> 2つエラーが出ていて先に.Net Runtimeエラーが出て、その後Applicationエラーが出ていました。エラーの内容は
バックアップ後にシャットダウンするようタスク用スクリプトを修正するか、シャットダウンタスク起動時にバックアップタスクの終了確認をし動作中なら
時間をおいてリトライするようにした方がよいと思います。バックアップに時間がかかる毎ににタスクを変更するのはバックアップの精度を落とすことになって
しまいます。


> .Net Runtime
> アプリケーション:SB_G.exe
> フレームワークのバージョン: v4.0.30319
> 説明: ハンドルされない例外のため、プロセスが中止されました。
> 例外情報: System.IO.PathTooLongException
> スタック:
> 場所 System.IO.Path.NormalizePath(System.String, Boolean, Int32)
> 場所 System.IO.Path.GetDirectoryName(System.String)
> 場所 SB_G.Program.Main(System.String[])
>
> Application
> 障害が発生しているアプリケーション名: SB_G.exe、バージョン: 1.0.0.0、タイム スタンプ: 0x4fd1439a
> 障害が発生しているモジュール名: KERNELBASE.dll、バージョン: 6.1.7601.17651、タイム スタンプ: 0x4e2111c0
> 例外コード: 0xe0434352
> 障害オフセット: 0x0000d36f
> 障害が発生しているプロセス ID: 0x650
> 障害が発生しているアプリケーションの開始時刻: 0x01cd803a08e54e36
> 障害が発生しているアプリケーション パス: C:\MATUKO\SB_G.exe
> 障害が発生しているモジュール パス: C:\Windows\system32\KERNELBASE.dll
> レポート ID: c6b564ab-ec63-11e1-a0b4-002522ac914a
> という内容でした。
> これってパスの名前の長さのエラーですかね?
PathTooLongExceptionが発生しているのでその通りだと思います。回避するのはAPI使うなりしないといけないので厄介ですね。
とりあえずスキップして他のファイルのコピーが止まらないように工夫したほうがよいです。
昼間動いたと思ったのは気のせいですね。

引用返信 編集キー/
■63405 / inTopicNo.14)  Re[7]: ファイルのコピーで失敗してしまいます。
□投稿者/ 魔界の仮面弁士 (34回)-(2012/08/23(Thu) 09:30:45)
No63401 (裕猫 さん) に返信
> 例外情報: System.IO.PathTooLongException
先のエラーとは異なる内容になっていますね。別の問題が並行して発生しているのかも。


> これってパスの名前の長さのエラーですかね?
そのようですね。
エラー発生時に、コピー元とコピー先のパスを記録するようにしてみてください。


なお、OS 仕様としては MAX_PATH は 260 のはずですが、これはドライブレターや
終端NULLを含めたパスなので、実際に使える長さはこれよりも若干短いです。
(CD-ROM 等に焼く場合には、より制限がきつくなることもあります)
http://blogs.wankuma.com/tocchann/archive/2007/05/17/77107.aspx
http://d.hatena.ne.jp/tt_clown/20110420/win32api_max_path


.NET のマネージコードでは無く、FileSystemObject や API を使った場合には、
接頭辞 \\?\ を用いたパス表記にすることで、3.2万文字までのパスを扱えますが、
あまり長いパスだと、エクスプローラーからでさえ正常にアクセスできなくなります。

あまりにも長い名前が存在するようであれば、
 ・より短いパスに変更することを検討する
 ・tar / CAB / ZIP / LZH でアーカイブした上で保存する
などを検討することになるでしょう。
引用返信 編集キー/
■63429 / inTopicNo.15)  Re[8]: ファイルのコピーで失敗してしまいます。
□投稿者/ 裕猫 (12回)-(2012/08/24(Fri) 09:04:37)
No63403 (オショウ さん) に返信
> ROBOCOPY が、使えるなら・・・
>
> Microsoft SyncFramework の、Sync Services for File Systems 使ったら
> 如何でしょう? 私は、それ使ってバックアップさせました。
>
> あと、アプリではなく、サービスにするとか・・・
> いろいろな対処をプログラムしないといけない部分を、提供されている機
> 能でカバーできてしまうので、コーディング量も減り、シンプルで確実に
> 動作するものができやすいと思いますが。
>
> 以上。参考まで
参考意見ありがとうございます。そちらも調べてみます。
引用返信 編集キー/
■63430 / inTopicNo.16)  Re[8]: ファイルのコピーで失敗してしまいます。
□投稿者/ 裕猫 (13回)-(2012/08/24(Fri) 09:14:38)
No63404 (shu さん) に返信
> バックアップ後にシャットダウンするようタスク用スクリプトを修正するか、シャットダウンタスク起動時にバックアップタスクの終了確認をし動作中なら
> 時間をおいてリトライするようにした方がよいと思います。バックアップに時間がかかる毎ににタスクを変更するのはバックアップの精度を落とすことになって
> しまいます。
バックアップはサーバーで行わずクライアント機で行っています。サーバーは無停電電源のタイマーでon offしていますのでシャットダウンのタイミングはそれぞれで同期ができません。
サーバーでバックアップしないのはサーバーが最小権限のアカウントで動作しているためで、サーバーからバックアップしたいファイルにアクセスができないようになっています。
そのため全権を持っているアカウントのクライアントで接続しそのクライアント機でバックアップしています。

> PathTooLongExceptionが発生しているのでその通りだと思います。回避するのはAPI使うなりしないといけないので厄介ですね。
> とりあえずスキップして他のファイルのコピーが止まらないように工夫したほうがよいです。
> 昼間動いたと思ったのは気のせいですね。
やはり既存のソフトなりを使うほうがいいようですね。そちらの方向で考えます。
引用返信 編集キー/
■63431 / inTopicNo.17)  Re[8]: ファイルのコピーで失敗してしまいます。
□投稿者/ 裕猫 (14回)-(2012/08/24(Fri) 09:19:01)
No63405 (魔界の仮面弁士 さん) に返信
> 先のエラーとは異なる内容になっていますね。別の問題が並行して発生しているのかも。
> エラー発生時に、コピー元とコピー先のパスを記録するようにしてみてください。

> なお、OS 仕様としては MAX_PATH は 260 のはずですが、これはドライブレターや
> 終端NULLを含めたパスなので、実際に使える長さはこれよりも若干短いです。
> (CD-ROM 等に焼く場合には、より制限がきつくなることもあります)
> http://blogs.wankuma.com/tocchann/archive/2007/05/17/77107.aspx
> http://d.hatena.ne.jp/tt_clown/20110420/win32api_max_path
>
>
> .NET のマネージコードでは無く、FileSystemObject や API を使った場合には、
> 接頭辞 \\?\ を用いたパス表記にすることで、3.2万文字までのパスを扱えますが、
> あまり長いパスだと、エクスプローラーからでさえ正常にアクセスできなくなります。
>
> あまりにも長い名前が存在するようであれば、
>  ・より短いパスに変更することを検討する
>  ・tar / CAB / ZIP / LZH でアーカイブした上で保存する
> などを検討することになるでしょう。
フォルダーの階層が結構深いので限界がきているのかもしれません。既存のものでバックアップできるものを探そうと思います。次のバックアップは火曜日なのでそれまでにいろいろ探してみます。ありがとうございました。
引用返信 編集キー/
■63437 / inTopicNo.18)  Re[9]: ファイルのコピーで失敗してしまいます。
□投稿者/ 魔界の仮面弁士 (38回)-(2012/08/25(Sat) 14:04:30)
2012/08/25(Sat) 14:19:44 編集(投稿者)

No63431 (裕猫 さん) に返信
> フォルダーの階層が結構深いので限界がきているのかもしれません。
No63401 の System.IO.PathTooLongException はそれで説明がつくとして、
No63391 の System.InvalidOprerationException も同じ理屈……なのでしょうか。

ネットワーク上のパスに対して、MAX_PATH を超える指定をする場合の記述はこんな感じ。
System.IO 名前空間のクラスでは使えそうにないですけれどね。
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=30279&no=0&KLOG=3

> 既存のものでバックアップできるものを探そうと思います。
既に挙がっている ROBOCOPY が、MAX_PATH や ACL コピーに対応していたはずです。
シンボリックリンクにも対応しているようですね。
https://iris.akj.co.jp/traction#/single&proj=DocJp&rec=979&brief=n
http://technet.microsoft.com/ja-jp/magazine/2006.11.utilityspotlight.aspx

それ以外で MAX_PATH 越えのバックアップというと、FastCopy とかですかね。
ACL や、NTFS代替データストリームまでもコピーできますし、マニュアルによれば
ハードリンク/ジャンクション/マウントポイント/シンボリックリンクにも対応とのこと。
http://ipmsg.org/tools/fastcopy.html
引用返信 編集キー/
■63451 / inTopicNo.19)  Re[10]: ファイルのコピーで失敗してしまいます。
□投稿者/ 裕猫 (15回)-(2012/08/27(Mon) 09:12:02)
No63437 (魔界の仮面弁士 さん) に返信
> No63391 の System.InvalidOprerationException も同じ理屈……なのでしょうか。
OSのログをみるとサーバーのシャットダウン時間に起きているので 、これは別物です。推測ではバックアップ完了前にサーバーがシャットダウンしてしまい、このエラーを出したと推測します。シャットダウンまで4時間とってあるので計算上は終わっているはずなのですが、実際には終わっていなかったのだと思われます。こちらは明後日結果が分かると思います。
No63401 は水曜日に起動しますので木曜日に結果が分かると思います。

> http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=30279&no=0&KLOG=3
ぴったりのURLありがとうございます。自分のプログラム力を上げるためにもこの方法試してみます。
引用返信 編集キー/
■63470 / inTopicNo.20)  Re[11]: ファイルのコピーで失敗してしまいます。
 
□投稿者/ 裕猫 (16回)-(2012/08/30(Thu) 09:01:08)
おはようございます。
 皆様いろいろアドバイスありがとうございました。FとGのバックアップ結果が出ましたのでご報告いたします。
F 完了
G 途中でサーバーがシャットダウンしましたが、今朝サーバーが起動したときからバックアップが再開されています。
今もバックアップ中ですが、エラーを出していたところは通過しましたので大丈夫と判断いたしました。
どうやらGドライブのバックアップにはかなりの時間がかかるようで、なぜそんなに時間がかかるのかがわかりませんが、とにかく無事バックアップ完了できそうです。
以前ではF,G,E3つのドライブ全部で8時間あればバックアップできたんですが、Gだけで9時間もかかっています。(まだ継続中ですが)
ちなみに今回のバックアップはROBOCOPYで実行しています。非常に役立つ情報をいただき感謝しております。
 おかげさまで無事バックアップできるようになりましたので解決とさせていただきます。 ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -