Файл или папка переименовываются в нижний регистр В С# с помощью DirectoryInfo/FileInfo.MoveTo()

У меня есть программа, которая переименовывает файлы или папки в строчные буквы. Я написал этот код:

    private void Replace(string FolderLocation, string lastText, string NewText)
    {
        if (lastText == "")
        {
            lastText = " ";
        }
        if (NewText == "")
        {
            NewText = " ";
        }

        DirectoryInfo i = new DirectoryInfo(FolderLocation);
        string NewName = "";
        if (checkBox2.Checked)
        {
            if (i.Parent.FullName[i.Parent.FullName.Length - 1].ToString() != "\\") //For parents like E:/
            {
                NewName = i.Parent.FullName + "\\" + i.Name.Replace(lastText, NewText);
            }
            else
            {
                NewName = i.Parent.FullName + i.Name.Replace(lastText, NewText);
            }

                NewName = NewName.ToLower();


            if (NewName != i.FullName)
            {
                 i.MoveTo(NewName);
            }
            foreach (DirectoryInfo sd in i.GetDirectories())
            {
                Replace(sd.FullName, lastText, NewText);
            }
        }
        if (checkBox1.Checked)
        {
            foreach (FileInfo fi in i.GetFiles())
            {
                NewName = fi.Directory + "\\" + fi.Name.Replace(lastText, NewText);

                    NewName = NewName.ToLower();

                if (NewName != fi.FullName)
                {
                    fi.MoveTo(NewName);
                }
            }
        }
    }

Но я получаю следующее исключение:

"Исходный и конечный пути должны быть разными."

Как я могу решить эту проблему?


person ahmadali shafiee    schedule 16.11.2011    source источник
comment
Windows нечувствительна к регистру в отношении имен файлов.   -  person Oded    schedule 16.11.2011
comment
хорошо. но как он показывает имена файлов?   -  person ahmadali shafiee    schedule 16.11.2011
comment
Он использует то, что сохранено. А вот при сравнении имен файлов - "FILENAME" == "filename" == "FileName", насколько это возможно.   -  person Oded    schedule 16.11.2011
comment
Я думаю, что ОС Windows не разрешает иметь данный файл, например, test.txt и Test.txt в одной папке. Вот почему вы получаете исключение. MoveTo копирует файл в новую позицию и удаляет старую. Вместо этого попробуйте FileSystem.Rename (msdn.microsoft.com/ ru-ru/библиотека/)   -  person Pilgerstorfer Franz    schedule 16.11.2011
comment
@PilgerstorferFranz, хотя в стандартных случаях вы правы, Windows / NTFS на самом деле можно настроить так, чтобы это разрешалось.   -  person Yahia    schedule 16.11.2011


Ответы (4)


Поскольку Windows нечувствительна к регистру, что касается имен файлов, вам нужно будет переименовать файл во временное имя, а затем переименовать обратно, используя символы нижнего регистра.

person Oded    schedule 16.11.2011
comment
теперь я получил отказ в доступе. Но я запускаю его как администратор. Что происходит ?? - person ahmadali shafiee; 16.11.2011
comment
@ahmadalishafiee - отказ в доступе всегда означает отсутствие разрешений. Убедитесь, что путь разрешен для пользователя, выполняющего приложение (может быть, вашим пользователем). - person Oded; 16.11.2011
comment
Значит нет доступа к файлам/папкам для программ. Но я хочу опубликовать свою программу. Как исправить эту ошибку? - person ahmadali shafiee; 16.11.2011
comment
Скорее всего, каталог используется. Это может быть простой экземпляр проводника Windows. Операции каталога с DirectoryInfo очень чувствительны к этому. - person sɐunıɔןɐqɐp; 30.03.2020

Хотя файловые системы Windows хранят имена с учетом регистра, они не чувствительны к регистру при сравнении имен, поэтому ваша операция переименования не будет работать...

ЕСЛИ вам действительно нужно/хотите это сделать, вам нужно будет сначала временно переименовать файл/каталог во что-то другое и уникальное, а затем переименовать его «назад» в «имя нижнего регистра», которое вы хотите.

Для справки см. http://msdn.microsoft.com/en-us/library/ee681827%28v=vs.85%29.aspx и http://support.microsoft.com/kb/100108/en-us .

ЕСЛИ вам нужно, чтобы NTFS была чувствительна к регистру, вы можете установить двойное слово ObCaseInsensitive под HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\ равным 0 (НЕ РЕКОМЕНДУЕТСЯ!).

ЕСЛИ вы имеете дело с NFS, см. http://technet.microsoft.com/en-us/library/cc783185%28WS.10%29.aspx .

person Yahia    schedule 16.11.2011

Это работает:

File.Move(destinationFilePath, destinationFilePath);
person Nathan    schedule 28.04.2020

К сожалению, это проблема Windows, поскольку она нечувствительна к регистру, как упоминает Одед в комментариях. Что вам нужно сделать, так это дважды переименовать папку. Переместив папку на новое временное имя, а затем вернитесь к нижнему регистру исходного имени.

person Richard    schedule 16.11.2011
comment
Это не проблема Windows, это проблема .Net. MoveFileEx Win32 поддерживает переименование только с учетом регистра; .Net ошибается. - person antiduh; 09.12.2016