.NET Framework
System.IO.Fileクラス
サーチ…
構文
- 文字列ソース。
- 文字列の宛先。
パラメーター
パラメータ | 詳細 |
---|---|
source | 別の場所に移動するファイル。 |
destination | source を移動するディレクトリ(この変数には、ファイルの名前(およびファイル拡張子)も含める必要があります)。 |
ファイルを削除する
ファイルを削除するには(必要な権限がある場合)次のように簡単です:
File.Delete(path);
しかし、多くのことが間違っているかもしれません:
- 必要な権限がありません(
UnauthorizedAccessException
がスローされます)。 - ファイルが他の人によって使用されている可能性があります(
IOException
がスローされます)。 - 低レベルのエラーまたはメディアが読み取り専用のためにファイルを削除できません(
IOException
がスローされます)。 - ファイルはもう存在しません(
IOException
がスローされます)。
最後のポイント(ファイルは存在しない)は、通常次のようなコードスニペットで回避されることに注意してください。
if (File.Exists(path))
File.Delete(path);
しかし、それはへの呼び出しの間に他の誰かによって削除することができるアトミック操作とファイルではありませんFile.Exists()
と前File.Delete()
I / O操作を処理するための適切なアプローチには、例外処理が必要です(操作が失敗した場合に別の方法で処理を行うことが前提です)。
if (File.Exists(path))
{
try
{
File.Delete(path);
}
catch (IOException exception)
{
if (!File.Exists(path))
return; // Someone else deleted this file
// Something went wrong...
}
catch (UnauthorizedAccessException exception)
{
// I do not have required permissions
}
}
このI / Oエラーは、一時的なもの(たとえば、ファイルが使用中)であり、ネットワーク接続が関与している場合、私たちの側から何の処置もなしに自動的に復旧する可能性があることに注意してください。次に、各試行の間にわずかな遅延を伴いながら、I / O操作を数回再試行することが一般的です。
public static void Delete(string path)
{
if (!File.Exists(path))
return;
for (int i=1; ; ++i)
{
try
{
File.Delete(path);
return;
}
catch (IOException e)
{
if (!File.Exists(path))
return;
if (i == NumberOfAttempts)
throw;
Thread.Sleep(DelayBetweenEachAttempt);
}
// You may handle UnauthorizedAccessException but this issue
// will probably won't be fixed in few seconds...
}
}
private const int NumberOfAttempts = 3;
private const int DelayBetweenEachAttempt = 1000; // ms
注:Windows環境ファイルでは、この関数を呼び出すときに実際には削除されません。他の人がFileShare.Delete
を使用してファイルを開くと、ファイルを削除できますが、所有者がファイルを閉じるときにのみ有効です。
テキストファイルから不要な行を取り除く
テキストファイルを変更するには、コンテンツを移動する必要があるため、簡単ではありません。 小さなファイルの場合、最も簡単な方法は、その内容をメモリに読み込んだ後、修正されたテキストを書き戻すことです。
この例では、ファイルからすべての行を読み込み、すべての空白行を削除して元のパスに書き戻します。
File.WriteAllLines(path,
File.ReadAllLines(path).Where(x => !String.IsNullOrWhiteSpace(x)));
ファイルが大きすぎてメモリにロードできず、出力パスが入力パスと異なる場合:
File.WriteAllLines(outputPath,
File.ReadLines(inputPath).Where(x => !String.IsNullOrWhiteSpace(x)));
テキストファイルの変換を変換する
テキストはエンコードされて保存されます( 文字列のトピックも参照してください)。次に、エンコーディングを変更する必要がある場合があります。この例では、ファイルが大きすぎず、
public static void ConvertEncoding(string path, Encoding from, Encoding to)
{
File.WriteAllText(path, File.ReadAllText(path, from), to);
}
変換を実行する際、ファイルにBOM(Byte Order Mark)が含まれている可能性があることを忘れないでください。Encoding.UTF8.GetStringは、Preamble / BOMを考慮していません 。
大量のファイルを「タッチ」する(最後の書き込み時間を更新する)
この例は、(使用してファイルの膨大な数の最終書き込み時刻更新System.IO.Directory.EnumerateFiles
代わりのSystem.IO.Directory.GetFiles()
オプションで検索パターンを指定することができます(デフォルトは"*.*"
最終的にディレクトリツリー(指定したディレクトリだけでなく)を検索します。
public static void Touch(string path,
string searchPattern = "*.*",
SearchOptions options = SearchOptions.None)
{
var now = DateTime.Now;
foreach (var filePath in Directory.EnumerateFiles(path, searchPattern, options))
{
File.SetLastWriteTime(filePath, now);
}
}
指定された量より古いファイルを列挙する
このスニペットは、指定された保存期間より古いすべてのファイルを列挙するヘルパー関数です。たとえば、古いログファイルや古いキャッシュデータを削除する必要がある場合などに便利です。
static IEnumerable<string> EnumerateAllFilesOlderThan(
TimeSpan maximumAge,
string path,
string searchPattern = "*.*",
SearchOption options = SearchOption.TopDirectoryOnly)
{
DateTime oldestWriteTime = DateTime.Now - maximumAge;
return Directory.EnumerateFiles(path, searchPattern, options)
.Where(x => Directory.GetLastWriteTime(x) < oldestWriteTime);
}
このように使用されます:
var oldFiles = EnumerateAllFilesOlderThan(TimeSpan.FromDays(7), @"c:\log", "*.log");
注意すべきことはほとんどありません。
- 検索は、
Directory.EnumerateFiles()
代わりにDirectory.GetFiles()
を使用して実行されます。エニュメレーションは生きているので、すべてのファイルシステムエントリがフェッチされるまで待つ必要はありません。 - 最後の書き込み時間を確認していますが、作成時間や最終アクセス時間を使用することがあります(たとえば、 未使用のキャッシュファイルを削除する場合は、アクセス時間が無効になる可能性があることに注意してください)。
- 粒度はすべてのプロパティ(書き込み時間、アクセス時間、作成時間)で一様ではなく、MSDNでこれについての詳細を確認してください。
ある場所から別の場所にファイルを移動する
File.Move
ある場所から別の場所にファイルを移動するには、単純なコード行でこれを実現できます。 File.Move(@"C:\TemporaryFile.txt", @"C:\TemporaryFiles\TemporaryFile.txt");
しかし、この単純な操作では間違っていることが多くあります。たとえば、プログラムを実行しているユーザーに 'C'というラベルのドライブがない場合はどうなりますか?彼らがした場合 - 彼らはそれを 'B'または 'M'に名前を変更することに決めましたか?
ソースファイル(移動したいファイル)があなたの知らないうちに移動された場合、または単純に存在しない場合はどうなりますか?
これは、まずソースファイルが存在するかどうかを確認することによって回避できます。
string source = @"C:\TemporaryFile.txt", destination = @"C:\TemporaryFiles\TemporaryFile.txt";
if(File.Exists("C:\TemporaryFile.txt"))
{
File.Move(source, destination);
}
これは、その時点でファイルが存在し、別の場所に移動できることを保証します。 File.Exists
への単純な呼び出しではFile.Exists
な場合があります。そうでない場合は、再度確認し、操作が失敗したことをユーザーに伝えます。または例外を処理します。
FileNotFoundException
は遭遇する可能性のある唯一の例外ではありません。
考えられる例外については以下を参照してください。
例外タイプ | 説明 |
---|---|
IOException | ファイルがすでに存在するか、ソースファイルが見つかりませんでした。 |
ArgumentNullException | Sourceおよび/またはDestinationパラメータの値はnullです。 |
ArgumentException | SourceパラメーターまたはDestinationパラメーターの値が空であるか、無効な文字が含まれています。 |
UnauthorizedAccessException | この操作を実行するために必要な権限がありません。 |
PathTooLongException | ソース、宛先、または指定されたパスが最大長を超えています。 Windowsでは、パスの長さは248文字未満でなければならず、ファイル名は260文字未満でなければなりません。 |
DirectoryNotFoundException | 指定されたディレクトリが見つかりませんでした。 |
NotSupportedException | SourceまたはDestinationパスまたはファイル名の形式が無効です。 |