2016-02-05 50 views
1

我使用C#上的Microsoft Visual C#在Windows应用程序的工作2010年奇怪的问题时,文件名和文件夹名称相同

的应用是帮助用户更改多个名称文件在一个目录中。例如:

我有一个目录c五个文件:/ TEMP命名为:

rainmoon.txt

terrain.txt

things.txt

pipe.txt

temp.txt

如果我尝试重命名“rainmoon.tx t“说,”rainsun.txt“,然后我只需要输入,我只想用”太阳“来代替”月亮“。我的应用程序是这样一种方式,它将浏览所有包含“月亮”的文件,然后继续用“太阳”代替它

问题出现在文件名(temp.txt)和文件夹(也称为temp)文件所在的名称相同。因此,对于上面给出的例子,如果我尝试重命名甚至部分“temp.txt”,我得到一个DirectoryNotFoundException。

下面是我使用的代码。我尽了最大的努力来解决这个问题,我强烈地感觉到这是由File.Move引起的。

for (int x = 0; x <= filesCheckList.CheckedItems.Count - 1; x++) 
         { 
          globalvar.fName = filesCheckList.CheckedItems[x].ToString(); 

          DirectoryInfo mydir = new DirectoryInfo(globalvar.DIR); 

          FileInfo[] filesx = mydir.GetFiles(".", SearchOption.AllDirectories); 

          FileInfo[] f = mydir.GetFiles(); 

          foreach (FileInfo file in filesx) 
          { 
           //try 
           { 
            if (file.Name == globalvar.fName) 
            { 
             if (file.Name != "History.txt") 
              File.Move(file.FullName, file.FullName.ToString().Replace(globalvar.FIL, globalvar.REP)); 
            } 
           } 
          } 
         } 

我的完整代码是在任何人想要查看的情况下。我不排除也许在编码的某个地方导致这个问题。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 

namespace TOMOD_W_A 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      applyButton.Enabled = false;  
     } 

     private void applyButton_Click(object sender, EventArgs e) 
     { 
      globalvar.FIL = filTxt.Text; 
      globalvar.REP = repTxt.Text; 


      if (string.IsNullOrWhiteSpace(dirTxt.Text)) 
       MessageBox.Show("Please Key in a Directory"); 
      else if (globalvar.FIL == String.Empty) 
       MessageBox.Show("Please give a file name"); 
      else 
      { 
       try 
       { 
        if (filesCheckList.CheckedItems.Count != 0) 
        { 
         for (int x = 0; x <= filesCheckList.CheckedItems.Count - 1; x++) 
         { 
          globalvar.fName = filesCheckList.CheckedItems[x].ToString(); 

          DirectoryInfo mydir = new DirectoryInfo(globalvar.DIR); 

          //DirectoryInfo[] directories = mydir.GetDirectories(".", SearchOption.TopDirectoryOnly); 

          FileInfo[] filesx = mydir.GetFiles(".", SearchOption.AllDirectories); 

          FileInfo[] f = mydir.GetFiles(); 

          foreach (FileInfo file in filesx) 
          { 
           //try 
           { 
            if (file.Name == globalvar.fName) 
            { 
             if (file.Name != "History.txt") 
              File.Move(file.FullName, file.FullName.ToString().Replace(globalvar.FIL, globalvar.REP)); 
            } 
           } 

           /***************************** 
           globalvar.DIR = dirTxt.Text; 
       DirectoryInfo mydir = new DirectoryInfo(globalvar.DIR); 

       FileInfo[] filesx = mydir.GetFiles(".", SearchOption.AllDirectories); 

       FileInfo[] f = mydir.GetFiles(); 

       filesCheckList.Items.Clear(); 

       foreach (FileInfo file in filesx) 
       { 
        if (file.Name != "History.txt") 
         filesCheckList.Items.Add(file.Name); 
       } 
           * */ 
           /* catch (IOException) 
           { 
            MessageBox.Show("File names cannot be the same in the same folder"); 
            MessageBox.Show("File name cannot be empty"); 
           } 
           catch (ArgumentException) 
           { 
            MessageBox.Show("Cannot contain symbols/\\ : * ? < > | \" \n File name cannot be con"); 
           }*/ 
          } 
         } 
        } 
       } 

       catch (ArgumentNullException) 
       { 
        MessageBox.Show("Please key in a directory"); 
       } 

       //if (File.Exists(globalvar.DIR + @"\History.txt")) 
       try 
       { 
        string content = File.ReadAllText(globalvar.DIR + @"\History.txt"); 
        File.WriteAllText(globalvar.DIR + @"\History.txt", String.Empty); 

        /* using (System.IO.StreamWriter files = new System.IO.StreamWriter(globalvar.DIR + @"\History.txt", true)) 
        { 

         files.WriteLine("For multiple files:"); 
         files.WriteLine("Changed " + "\"" + globalvar.FIL + "\"" + " to " + "\"" + globalvar.REP + "\""); 
         DirectoryInfo mydir = new DirectoryInfo(globalvar.DIR); 

         FileInfo[] f = mydir.GetFiles(); 
         globalvar.clear = 1; 
         foreach (FileInfo file in f) 
         { 
          if (file.Name != "History.txt") 
          files.WriteLine(file.Name); 
         } 
         for (int x = 0; x <= filesCheckList.CheckedItems.Count - 1; x++) 
         { 
          files.WriteLine("in " + filesCheckList.CheckedItems[x].ToString() + "\n"); 
         } 
         files.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString()); 
         files.WriteLine("\n"); 
         files.WriteLine(content);       
        } */ 
       } 

       catch (FileNotFoundException) 
       { 
        using (System.IO.StreamWriter files = File.CreateText(globalvar.DIR + @"\History.txt")) 
        { 
         files.WriteLine("For multiple files:"); 
         files.WriteLine("Changed " + "\"" + globalvar.FIL + "\"" + " to " + "\"" + globalvar.REP + "\""); 
         files.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString()); 
         files.WriteLine("\n"); 
        } 
       } 
       MessageBox.Show("Your selected files have been changed"); 
      } 

     } 

     private void cancelButton_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 

     public static class globalvar 
     { 
      public static string DIR; 
      public static string FIL; 
      public static string REP; 
      public static string OPT; 
      public static string fName; 
      public static int clear = 0; 
      public static int proceed = 0; 
      public static int filpro = 0; 
      public static int cignm = 0; 
      public static int mngic = 0; 
     } 

     private void browseButton_Click(object sender, EventArgs e) 
     { 
      if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) 
       dirTxt.Text = folderBrowserDialog1.SelectedPath; 
     } 

     private void shfilButton_Click(object sender, EventArgs e) 
     { 
      applyButton.Enabled = true; 

      try 
      { 
       globalvar.DIR = dirTxt.Text; 
       DirectoryInfo mydir = new DirectoryInfo(globalvar.DIR); 

       FileInfo[] filesx = mydir.GetFiles(".", SearchOption.AllDirectories); 

       FileInfo[] f = mydir.GetFiles(); 

       filesCheckList.Items.Clear(); 

       foreach (FileInfo file in filesx) 
       { 
        if (file.Name != "History.txt") 
         filesCheckList.Items.Add(file.Name); 
       } 
      } 

      catch (DirectoryNotFoundException) 
      { 
       MessageBox.Show("Directory not found"); 
      } 

      catch (ArgumentException) 
      { 
       MessageBox.Show("Directory not found"); 
      } 

      catch (IOException) 
      { 
       MessageBox.Show("Directory is invalid"); 
      }    
     } 

     private void filChk_CheckedChanged(object sender, EventArgs e) 
     { 
      if (filChk.Checked) 
      { 
       for (int i = 0; i < filesCheckList.Items.Count; i++) 
       { 
        filesCheckList.SetItemChecked(i, true); 
       } 
      } 
      else 
      { 
       for (int i = 0; i < filesCheckList.Items.Count; i++) 
       { 
        filesCheckList.SetItemChecked(i, false); 
       } 
      }     
     } 

     private void dirTxt_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.KeyCode == Keys.Enter) 
      { 
       try 
       { 

        globalvar.DIR = dirTxt.Text; 
        DirectoryInfo mydir = new DirectoryInfo(globalvar.DIR); 

        FileInfo[] f = mydir.GetFiles(); 
        globalvar.clear = 1; 
        filesCheckList.Items.Clear(); 
        foreach (FileInfo file in f) 
        { 
         if (file.Name != "History.txt") 
          filesCheckList.Items.Add(file.Name); 
        } 
       } 

       catch (DirectoryNotFoundException) 
       { 
        MessageBox.Show("Directory not found"); 
       } 

       catch (ArgumentException) 
       { 
        MessageBox.Show("Directory not found"); 
       } 

       catch (IOException) 
       { 
        MessageBox.Show("Directory is invalid"); 
       } 
      } 
     } 

     private void dirTxt_TextChanged(object sender, EventArgs e) 
     { 

     } 
    } 
} 
+0

做任何回答的帮助? – ad1Dima

+1

非常感谢大家的建议!我使用了Ouarzy的理论并修改了ad1Dima的方法,并提出了以下内容: –

+0

File.Move(file.FullName,file.Directory.FullName.ToString()+“/”+ file.Name.ToString()。Replace(globalvar。 FIL,globalvar.REP)); –

回答

0

问题是有

file.FullName.ToString().Replace(globalvar.FIL, globalvar.REP) 

file.FullName是像C完整路径:\ TEMP \ TEMP.TXT所以当你说 'ABC' 替换字符串 '温度' 你有C:\ ABC \的abc.txt。但有没有这样的文件夹“ABC”

您应该结合新的路径那样:

file.Directory.FullName.ToString() + file.Name.ToString().Replace(globalvar.FIL, globalvar.REP) 
0

我强烈地感受到这是由于File.Move。

旧的引用:“如果你认为.net或JVM坏了,该休息了”。

而且你的代码是不漂亮,我肯定会推荐你读这种书:http://www.amazon.fr/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

但是,让我们忘了,对吧。

请把一个破发点上这一行:

File.Move(file.FullName, file.FullName.ToString().Replace(globalvar.FIL, globalvar.REP)); 

现在用一个例子,其中您的文件和文件夹的名称相同运行代码。 你看到了什么?

是的,file.FullName实际上包含文件夹的名称和文件的名称。现在会发生什么,如果你这样做:

file.FullName.ToString().Replace(globalvar.FIL, globalvar.REP)) 

您将重命名文件和文件夹。

例如,使用初始文件: c:/ temp/temp。TXT

阳光更换温度和你有C:/sun/sun.txt

当你需要首先创建的文件夹,.NET说:“C:/太阳”不存在。

据我了解你的用例,你想要的只是文件名:

file.Name.Replace(globalvar.FIL, globalvar.REP)) 

所以,你应该记录文件夹名称,只是重命名文件并将其移动到文件夹+ newfileName。

希望它有帮助。

相关问题