2017-10-03 9 views
0

私は最初にローカルに保存された文書を作成するプログラムを持っています。その後、それらをネットワークフォルダに送信します。拡張子を取り除いてファイルの名前を変更する

ラップトップでのユーザーのアクセス許可のため、ローカルドライブを削除できません。したがって、プログラムはそれらをコピーします。ローカルパーミッションが変更されたことを期待して、ローカルパーミッションを変更しようとすると、そのパーミッションを移動しようとします。失敗すると、それをコピーします。

foreach (var file in Directory.GetFiles(Properties.Settings.Default.MasterCopies, "*.xml")) 
{ 
    x = x + 1; 
    try 
    { 
     try 
     {  
      string NetworkPath = XMLWork.XMLGetElement(@"D:\\" + Properties.Settings.Default.currentUser + "\\Digital Statements\\App_Data\\User\\" + Properties.Settings.Default.currentUser + ".wit", "NetworkMasters"); 
      string FileName = Path.GetFileName(file); 
      string FilePath = NetworkPath; 
      File.Move(file, Path.Combine(FilePath, FileName)); 
     } 
     catch 
     { 
     } 
    } 
    catch 
    { 
     try 
     { 
      string NetworkPath = XMLWork.XMLGetElement(@"D:\\" + Properties.Settings.Default.currentUser + "\\Digital Statements\\App_Data\\User\\" + Properties.Settings.Default.currentUser + ".wit", "NetworkMasters"); 
      string FileName = Path.GetFileName(file); 
      string FilePath = NetworkPath; 
      File.Copy(file, Path.Combine(FilePath, FileName)); 
     } 
     catch 
     { 
     } 
    } 
    e.Result = x; 
    MasterBackups.ReportProgress(x); 
} 

私は、プログラムがすでに処理したファイルを常に試してコピーしないようにします。私はこれが最も簡単な方法は、ファイル拡張子 ".xml"をファイルから削除して、ネットワークにコピーした後、次の実行時にファイルが表示されないようにすることだと考えています。

これを達成するには - プログラムに "Test.xml"が表示され、ネットワークにコピーしてローカルコピーの名前を "Test"に変更しますか?

EDIT - ローカルでファイルの名前を変更できますが、移動または削除できません。パーミッションはIT部門によって設定されています。なぜなら、このように設定されている理由はわかりませんが、それはそうです!

+4

ファイルを削除できない場合は、名前を変更できません。 – Equalsk

+0

ここではいくつのファイルについて話していますか? – Steve

+0

削除が失敗するという事実は、ファイルが読み込み専用であることを意味します。名前を変更することはできません。 –

答えて

0

代わりに一時ファイルを作成するのはどうですか?メソッドPath.GetTempFileNameを参照してください。最も理想的なソリューションではありませんが、プログラムで削除できない場合は、少なくとも最終的にクリーンアップされる場所(ユーザーがディスククリーンアップを実行するときなど)に置くことができます。

0

既に処理された各ファイル名を維持するテキストファイルまたはsqliteデータベースに、すでに処理されたファイル名を保存することができます。対処する前にこのリストと比較して、新しいファイルがコピーされるたびにテキスト/データベースに追加/挿入してください。

0

このようなものはどうですか。ファイルの末尾に_copy_Dateという名前のファイルの名前を変更します。 (拡張の前に)。この方法で、最後にコピーしたときにファイルのプロパティを調べることなく、いつ知っていますか。

List<String> files = Directory.GetFiles(Properties.Settings.Default.MasterCopies, "*.xml"); 
foreach (var file in files) 
{ 
    x = x + 1; 
    try 
    { 

     string NetworkPath = XMLWork.XMLGetElement(@"D:\\" + Properties.Settings.Default.currentUser + "\\Digital Statements\\App_Data\\User\\" + Properties.Settings.Default.currentUser + ".wit", "NetworkMasters"); 
     string FileName = Path.GetFileName(file) + "_Copy_" + DateTime.Now; // Append some info to copyed file name 
     string FilePath = NetworkPath; 
     if (!files.Contains(FileName)) // Check if copy file is in directory already 
     { 
      File.Move(file, Path.Combine(FilePath, FileName)); 
     } 
    } 
    catch 
    { 
     // Catch something here 
    } 
    e.Result = x; 
    MasterBackups.ReportProgress(x); 
} 
0

@Equalsk got it - ここに私のコードです。 ファイルをネットワークにコピーし、最後から ".XML"をトリミングして ".DEL"に置き換えます。そうすれば、権限がソートされたら ".DEL"を削除することができます。

string NetworkPath = XMLWork.XMLGetElement(@"D:\\" + Properties.Settings.Default.currentUser + "\\Digital Statements\\App_Data\\User\\" + Properties.Settings.Default.currentUser + ".wit", "NetworkMasters"); 
        string FileName = Path.GetFileName(file); 
        string LocalPath = Path.GetFullPath(file); 
        string FilePath = NetworkPath; 
        File.Copy(file, Path.Combine(FilePath, FileName)); 
        string NewFileName = LocalPath.TrimEnd('.', 'x', 'm', 'l'); 
        //MessageBox.Show(NewFileName); 
        File.Move(file, NewFileName+".del"); 
関連する問題