VB.NET や C# で File.Copy メソッドを使用してファイルのコピーを行っても、コピー先のファイルが読み取り専用属性の場合、ファイルコピーに失敗する場合があります。ここでは、ファイルの読み取り専用属性を解除してファイルのコピーを行うサンプルを掲載しています。
スポンサーリンク
読み取り専用属性を解除してファイルコピー
読み取り専用属性のファイルでも 「 アクセスが拒否されました 」 のエラーを発生させないでファイルの上書きコピーを行うサンプルコードです。
VB.NET
Dim src As String = "D:\コピー元.txt"
Dim dst As String = "D:\コピー先.txt"
If File.Exists(dst) Then
' ファイル属性を取得
Dim fa As FileAttributes = File.GetAttributes(dst)
' 読み取り専用属性を削除(他の属性は変更しない)
fa = fa And Not FileAttributes.ReadOnly
' ファイル属性を設定
File.SetAttributes(dst, fa)
End If
' ファイルの上書きコピー
File.Copy(src, dst, True)
C#
string src = @"C:\コピー元.txt";
string dst = @"C:\コピー先.txt";
if (File.Exists(dst)) {
// ファイル属性を取得
FileAttributes fa = File.GetAttributes(dst);
// 読み取り専用属性を削除(他の属性は変更しない)
fa = fa & ~FileAttributes.ReadOnly;
File.SetAttributes(dst, fa);
}
// ファイルの上書きコピー
File.Copy(src, dst, true);
ファイル属性の一覧
ちなみにファイルの属性の一覧がこちらです。C# での定義になります。 IntegrityStream と NoScrubData の間が欠番のようです。今後追加されるかもしれません。
C#
public enum FileAttributes
{
// ファイルは読み取り専用です。
ReadOnly = 1,
// ファイルは隠しファイルです。したがって通常のディレクトリ リストには表示されません。
Hidden = 2,
// ファイルはシステム ファイルです。つまり、このファイルはオペレーティング システムの一部であるか、オペレーティング システムによって排他的に使用されます。
System = 4,
// ファイルはディレクトリです。
Directory = 16,
// ファイルは、バックアップまたは削除の候補です。
Archive = 32,
// 将来使用するために予約されています。
Device = 64,
// ファイルは、特別な属性を持たない標準ファイルです。この属性は、単独で使用された場合のみ有効です。
Normal = 128,
// 一時ファイルです。一時ファイルには、アプリケーションを実行中は必要で、アプリケーションを終了すると不要になるデータが含まれています。
// ファイル システムは、データを大容量ストレージにフラッシュするのではなく、すべてのデータをメモリに保持するよう試みて、すばやくアクセスできるようにします。
// 一時ファイルが不要になったら、アプリケーションが直ちに削除する必要があります。
Temporary = 256,
// ファイルはスパース ファイルです。スパース ファイルは、通常、データの大部分が 0 である大きなファイルです。
SparseFile = 512,
// ファイルには、ファイルまたはディレクトリに関連付けられたユーザー定義のデータ ブロックである、リパース ポイントが含まれています。
ReparsePoint = 1024,
// ファイルは圧縮ファイルです。
Compressed = 2048,
// ファイルはオフラインです。オフラインのファイルのデータは、即時には使用できません。
Offline = 4096,
// ファイルは、オペレーティング システムによるコンテンツ インデックス サービスでインデックスされません。
NotContentIndexed = 8192,
// ファイルまたはディレクトリは暗号化されています。ファイルの場合は、ファイルのすべてのデータが暗号化されています。
// ディレクトリの場合は、新規作成されるファイルおよびディレクトリが既定で暗号化されます。
Encrypted = 16384,
// ファイルまたはディレクトリには、データ整合性のサポートが含まれます。この値がファイルに適用されると、
// ファイルのすべてのデータ ストリームは整合性サポートを持ちます。この値がディレクトリに適用されると、
// そのディレクトリ内のすべての新しいファイルとサブディレクトリは、既定で一貫性サポートを含みます。
IntegrityStream = 32768,
// ファイルまたはディレクトリは、データ整合性のスキャン対象から除外されます。この値がディレクトリに適用されると、
// そのディレクトリ内のすべての新しいファイルとサブディレクトリが既定でデータ一貫性から除外されます。
NoScrubData = 131072
}