0

タイマーを使用してファイルを移動するコードを以下に示します(10分ごとに200ファイルが移動されるか、設定フォームに保存されます)。

問題は、ファイルを開いて書き込むときにファイルが移動することです。プログラムでファイルを「開いて」例外をチェックする必要があることはわかっていますが、コードのどこに配置すればよいかわかりません。

try
{
            string origDir = @"" + Properties.Settings.Default.MoveFrom;
            string destDir = @"" + Properties.Settings.Default.MoveTo;
            string oldDir = @"" + Properties.Settings.Default.MoveToOld;

            int filesPerMove = Properties.Settings.Default.FilesPerMove;
            int i = 0;

            DateTime dateMove= DateTime.Now;

            DirectoryInfo dirInfo = new DirectoryInfo(origDir);
            FileInfo[] files = dirInfo.GetFiles("*.txt");

            foreach (string file in Directory.GetFiles(origDir))
                if (new FileInfo(file).Length > 0)
                {
                    if (i < filesPerMove)
                    {
                            ListViewItem lviSuccess = new ListViewItem(origFile.Name);
                            lviSuccess.SubItems.Add(origFile.LastWriteTime.ToString());
                            lviSuccess.SubItems.Add(dateMove.ToString());
                            lviSuccess.SubItems.Add(origFile.Length.ToString());
                            lviSuccess.SubItems.Add(origDir.ToString());
                            lviSuccess.SubItems.Add(destDir.ToString());
                            lvFileMoves.Items.Add(lviSuccess);
                            lviSuccess.UseItemStyleForSubItems = true;
                            lviSuccess.ForeColor = Color.Green;

                            FileInfo destFile = new FileInfo(file.Replace(origDir, destDir));
                            FileInfo destFile1 = new FileInfo(file.Replace(origDir, oldDir));
                            System.IO.File.Copy(origFile.FullName, destFile1.FullName, true);
                            System.IO.File.Copy(origFile.FullName, destFile.FullName, true);
                            File.Delete(origFile.FullName);                        
                            i++;
                        }
                    }
}
catch (System.IO.IOException ex)
{ 
            ListViewItem lvi = new ListViewItem(ex.Message);
            lvFileMoves.Items.Add(lvi);
            lvi.UseItemStyleForSubItems = true;
            lvi.ForeColor = Color.Red;
}
4

3 に答える 3

1

投票は悪です。

あなたが本当に望んでいるのは、変更が発生した場合に通知されることです。

ReadDirectoryChangesWは、これを行う 1 つの方法です。

これを使用する方法を示す適切なリンクを次に示します (C++ から、C#/Interop への変換は簡単なはずです)。

于 2012-10-21T18:05:28.833 に答える
0

今、私は以下を持っていますが、メモ帳で開いていないファイルであっても、すべてのファイルに対して例外が発生します。

 FileStream outStream = null;
 try
                    {
                        outStream = File.OpenWrite(origFile.ToString());

                            FileInfo destFile = new FileInfo(file.Replace(origDir, destDir));

                            FileInfo destFile1 = new FileInfo(file.Replace(origDir, oldDir));
                            System.IO.File.Copy(origFile.FullName, destFile1.FullName, true);
                            System.IO.File.Copy(origFile.FullName, destFile.FullName, true);
                            File.Delete(origFile.FullName);
                            lblSenast.Text = string.Format("Senaste flytt gjordes {0}",     dateMove.ToString());
                    }
                    catch (IOException exx)
                    {
                        ListViewItem lvi = new ListViewItem(exx.Message);
                        lvFileMoves.Items.Add(lvi);
                        lvi.UseItemStyleForSubItems = true;
                        lvi.ForeColor = Color.Gray;
                    }
                    finally
                    {
                        outStream.Close();
                        outStream.Dispose();
                    }

別のプロセスで使用されているため、プロセスはファイル「Blablabla」にアクセスできません

于 2012-10-22T12:51:37.977 に答える
0

例外処理をファイル処理の近くに配置する必要があります。

try
{
    FileInfo destFile = new FileInfo(file.Replace(origDir, destDir));
    FileInfo destFile1 = new FileInfo(file.Replace(origDir, oldDir));
    System.IO.File.Copy(origFile.FullName, destFile1.FullName, true);
    System.IO.File.Copy(origFile.FullName, destFile.FullName, true);
    File.Delete(origFile.FullName);                        
    i++;
}
catch(System.IO.IOException ex)
{ 
    ListViewItem lvi = new ListViewItem(ex.Message);
    lvFileMoves.Items.Add(lvi);
    lvi.UseItemStyleForSubItems = true;
    lvi.ForeColor = Color.Red;
}

このようにして、1 つのファイルが失敗したときに次のファイルを続行できます。

于 2012-10-21T18:04:33.037 に答える