質問
C#でファイル同期プログラムを作成中にメソッドを作成しようとしました copy
で LocalFileItem
を使用するクラス System.IO.File.Copy(destination.Path, Path, true)
メソッド Path
です string
.
このコードを宛先を指定して実行した後。 Path = "C:\\Test2"
そして this.Path = "C:\\Test\\F1.txt"
この操作を実行するために必要なファイル権限がないという例外が発生します。 C:\テスト, 、 しかし C:\テスト 私自身が所有しています (現在のユーザー).
何が起こっているのか、またはこれを回避する方法を知っている人はいますか?
これで元のコードが完成しました。
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace Diones.Util.IO
{
/// <summary>
/// An object representation of a file or directory.
/// </summary>
public abstract class FileItem : IComparable
{
protected String path;
public String Path
{
set { this.path = value; }
get { return this.path; }
}
protected bool isDirectory;
public bool IsDirectory
{
set { this.isDirectory = value; }
get { return this.isDirectory; }
}
/// <summary>
/// Delete this fileItem.
/// </summary>
public abstract void delete();
/// <summary>
/// Delete this directory and all of its elements.
/// </summary>
protected abstract void deleteRecursive();
/// <summary>
/// Copy this fileItem to the destination directory.
/// </summary>
public abstract void copy(FileItem fileD);
/// <summary>
/// Copy this directory and all of its elements
/// to the destination directory.
/// </summary>
protected abstract void copyRecursive(FileItem fileD);
/// <summary>
/// Creates a FileItem from a string path.
/// </summary>
/// <param name="path"></param>
public FileItem(String path)
{
Path = path;
if (path.EndsWith("\\") || path.EndsWith("/")) IsDirectory = true;
else IsDirectory = false;
}
/// <summary>
/// Creates a FileItem from a FileSource directory.
/// </summary>
/// <param name="directory"></param>
public FileItem(FileSource directory)
{
Path = directory.Path;
}
public override String ToString()
{
return Path;
}
public abstract int CompareTo(object b);
}
/// <summary>
/// A file or directory on the hard disk
/// </summary>
public class LocalFileItem : FileItem
{
public override void delete()
{
if (!IsDirectory) File.Delete(this.Path);
else deleteRecursive();
}
protected override void deleteRecursive()
{
Directory.Delete(Path, true);
}
public override void copy(FileItem destination)
{
if (!IsDirectory) File.Copy(destination.Path, Path, true);
else copyRecursive(destination);
}
protected override void copyRecursive(FileItem destination)
{
Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(
Path, destination.Path, true);
}
/// <summary>
/// Create's a LocalFileItem from a string path
/// </summary>
/// <param name="path"></param>
public LocalFileItem(String path)
: base(path)
{
}
/// <summary>
/// Creates a LocalFileItem from a FileSource path
/// </summary>
/// <param name="path"></param>
public LocalFileItem(FileSource path)
: base(path)
{
}
public override int CompareTo(object obj)
{
if (obj is FileItem)
{
FileItem fi = (FileItem)obj;
if (File.GetCreationTime(this.Path).CompareTo
(File.GetCreationTime(fi.Path)) > 0) return 1;
else if (File.GetCreationTime(this.Path).CompareTo
(File.GetCreationTime(fi.Path)) < 0) return -1;
else
{
if (File.GetLastWriteTime(this.Path).CompareTo
(File.GetLastWriteTime(fi.Path)) < 0) return -1;
else if (File.GetLastWriteTime(this.Path).CompareTo
(File.GetLastWriteTime(fi.Path)) > 0) return 1;
else return 0;
}
}
else
throw new ArgumentException("obj isn't a FileItem");
}
}
}
解決
File.Copy() のパラメータを間違えたようです。File.Copy(string source, string destination) である必要があります。
「C: est2」もディレクトリですか?ファイルをディレクトリにコピーすることはできません。代わりに次のようなものを使用してください。
File.Copy( sourceFile, Path.Combine(destinationDir,Path.GetFileName(sourceFile)) );
他のヒント
ちょっと推測ですが、次のような理由が考えられます。
- C でファイル操作を実行しようとしています:根?(Vista を使用している場合、これは保護されている可能性があります - わかりません?)
- 存在しないディレクトリにコピーしようとしていますか?
- ファイルはすでに存在しており、ロックされている可能性がありますか?(つまり、別のアプリケーション インスタンスを閉じていませんか)?
申し訳ありませんが、これ以上お役に立てません。File.Copy に関する問題はめったに経験したことがありません。
ミハルが私に正しい方向を示してくれたので、私は問題を解決することができました。問題は、File.Copy を使用してファイルをある場所から別の場所にコピーしようとしたのに対し、Copy メソッドはすべての内容を 1 つのファイルから別のファイルにコピーするだけである (宛先ファイルがまだ存在しない場合は作成する) ということでした。解決策は、ファイル名を宛先ディレクトリに追加することでした。すべての助けに感謝します!