2008-08-23 8 views
7

C#でファイル同期プログラムを作成中にcopyLocalFileItemクラスをののSystem.IO.File.Copy(destination.Path, Path, true)メソッドを使用するクラスに作成しようとしました。
このコードを宛先で実行した後。 \テストが、C:\テストは自分(現在のユーザー)によって所有され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"); 
     } 
    } 
} 

答えて

3

あなたがFile.Copyでパラメータを置き忘れてきたらしい()、それはFile.Copy(文字列のソース、文字列の先)でなければなりません。

また、ディレクトリ "C:\ Test2"ですか?ファイルをディレクトリにコピーすることはできません。 代わりにそのようなものを使用してください:

 
File.Copy( 
    sourceFile, 
    Path.Combine(destinationDir,Path.GetFileName(sourceFile)) 
    )
;

0

私はちょっとここでは推測しているが、ので、それは次のようになります。あなたがCでファイル操作を実行しようとしている

  • :ルート? (あなたがそれを使用している場合、これはVista上で保護されている可能性がありますか?確実ではありません)
  • 存在しないディレクトリにコピーしようとしていますか?
  • ファイルが既に存在し、ロックされている可能性がありますか? (つまり、別のアプリケーションインスタンスを閉じていない)

私は多くの助けになることはできません。私はほとんどFile.Copyで問題を経験していません。

0

私は問題を解決することができました。ミハエルは私に正しい方向を指摘しました。 問題は、File.Copyを使用してファイルをある場所から別の場所にコピーしようとしましたが、Copyメソッドはあるファイルから別のファイルにすべての内容をコピーするだけです(コピー先ファイルが存在しない場合は作成します)。解決策は、宛先ディレクトリにファイル名を追加することでした。 すべての助けてくれてありがとう!

関連する問題