Я не хотел бы добавить, что здесь есть проблема, все решения здесь, особенно если вы сравниваете и перемещаете файл из одного места в другое (каталог, а также имя файла), поскольку вы должны знать, что том может быть точка соединения ... поэтому, если newname - это q: \ SomeJunctionDirectory \ hello.txt, а старое имя - c: \ TargetOfJunctionPoint \ hello.txt ... файлы совпадают, а имена - нет.
Это решение не работает, когда имена файлов отличаются только в регистре букв. Например, file.txt и File.txt
SepehrM
2
@SepehrM, я просто дважды проверил, и он отлично работает на моем компьютере с Windows 8.1.
Крис Тейлор
1
@SepehrM, я не проверял это, но примеры, которые вы указываете использовать FileInfo.Move, а не File.Move, так что, может быть, это как-то связано с этим?
Крис Тейлор
2
@SepehrM Имена файловых систем Windows не чувствительны к регистру. File.txt и file.txt рассматриваются как одно и то же имя файла. Поэтому мне непонятно, когда вы говорите, что решение не работает. Что вы делаете именно это не работает?
Майкл
4
@ Майкл, файловая система нечувствительна к регистру, но она сохраняет имя файла в исходном регистре, введенном пользователем. В случае с SepehrM он пытался изменить регистр файла, который по какой-то причине не работал. Соответствие без учета регистра работало. HTH
В методе File.Move он не будет перезаписывать файл, если он уже существует. И это бросит исключение.
Поэтому нам нужно проверить, существует ли файл или нет.
/* Delete the file if exists, else no exception thrown. */File.Delete(newFileName);// Delete the existing file if existsFile.Move(oldFileName,newFileName);// Rename the oldFileName into newFileName
Или окружите его попыткой, чтобы избежать исключения.
будьте очень осторожны с этим подходом ... если ваш целевой каталог и исходный каталог совпадают, а «newname» на самом деле чувствительна к регистру версии «oldFileName», вы удалите, прежде чем сможете переместить ваш файл.
Адриан Хам
1
Вы также не можете просто проверить строки на равенство, так как существует несколько способов представления одного пути к файлу.
Дрю Ноакс
File.Move теперь имеет метод перегрузки, который позволяет перезаписать файл - File.Move (oldPath, newPath, true)
Элла,
39
Вы можете использовать, File.Moveчтобы сделать это.
eww ... Используйте Path.Combine () вместо сборки файла.
Адриан Хам
20
Первое решение
Избегайте System.IO.File.Moveразмещенных здесь решений (отмеченный ответ включен). Это терпит неудачу по сетям. Однако шаблон копирования / удаления работает локально и по сетям. Воспользуйтесь одним из решений для перемещения, но замените его на «Копировать». Затем используйте File.Delete, чтобы удалить исходный файл.
Вы можете создать метод Rename, чтобы упростить его.
Простота использования
Используйте сборку VB в C #. Добавить ссылку на Microsoft.VisualBasic
просто чтобы вы знали, Microsoft.VisualBasic.FileIO.FileSystem.RenameFile вызывает File.Move. Другие благодарят за нормализацию исходного файла и выполнение некоторых дополнительных проверок ошибок в аргументах, т.е. файл существует, имя файла не равно нулю и т. д. Затем он вызывает File.Move.
Крис Тейлор
Если Copy () не скопирует все файловые потоки, что, как я полагаю, нет, я бы не использовал удаление / копирование. Я предполагаю, что Move (), по крайней мере, если вы остаетесь в той же файловой системе, это просто переименование, и поэтому все файловые потоки будут поддерживаться.
Nickdu
«происходит сбой по сети», тогда вы собираетесь копировать и удалять, что фактически является загрузкой и выгрузкой, просто для удобства времени кода ... Что за сеть? Окна в общую папку ( smb), ftp, sshили что - то все есть команды / примитивы для файла перемещения / переименования , если не допускается (например , только для чтения).
Мяу Кошка 2012
16
Вы можете скопировать его как новый файл, а затем удалить старый, используя System.IO.Fileкласс:
Примечание для любого, кто читает это: Это анти-шаблон, файл может быть удален или переименован другим процессом или ОС между проверкой на наличие и вашим вызовом Copy. Вы должны вместо этого использовать попытку поймать.
user9993
Если том же, то это также огромная трата ввода / вывода, поскольку перемещение фактически переименовывает на уровне информации каталога.
Адриан Хам
Я обрабатываю тысячи файлов, и у меня сложилось впечатление, что Копировать / Удалить быстрее, чем Переместить.
Роберто
Как бы кто-нибудь придумал такую идею. Быстрее или нет, по крайней мере, вы убиваете диск. Говоря «переименовать» в вопросе, это должно означать переименование локально, что, конечно, не требует перемещения между разделами.
Мяу Кошка 2012
с File.Move я столкнулся с UnauthorizedAccessException, но эта последовательность копирования и удаления сработала. Спасибо!
Оливер Кениг
6
ПРИМЕЧАНИЕ. В этом примере кода мы открываем каталог и ищем PDF-файлы с открытыми и закрытыми круглыми скобками в имени файла. Вы можете проверить и заменить любой символ в имени, которое вам нравится, или просто указать новое имя, используя функции замены.
Есть и другие способы работы с этим кодом, чтобы сделать более сложные переименования, но моим главным намерением было показать, как использовать File.Move для пакетного переименования. Это работало против 335 файлов PDF в 180 каталогах, когда я запускал его на своем ноутбуке. Это подстегнуть момент кода, и есть более сложные способы сделать это.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BatchRenamer{classProgram{staticvoidMain(string[] args){var dirnames =Directory.GetDirectories(@"C:\the full directory path of files to rename goes here");int i =0;try{foreach(var dir in dirnames){var fnames =Directory.GetFiles(dir,"*.pdf").Select(Path.GetFileName);DirectoryInfo d =newDirectoryInfo(dir);FileInfo[] finfo = d.GetFiles("*.pdf");foreach(var f in fnames){
i++;Console.WriteLine("The number of the file being renamed is: {0}", i);if(!File.Exists(Path.Combine(dir, f.ToString().Replace("(","").Replace(")","")))){File.Move(Path.Combine(dir, f),Path.Combine(dir, f.ToString().Replace("(","").Replace(")","")));}else{Console.WriteLine("The file you are attempting to rename already exists! The file path is {0}.", dir);foreach(FileInfo fi in finfo){Console.WriteLine("The file modify date is: {0} ",File.GetLastWriteTime(dir));}}}}}catch(Exception ex){Console.WriteLine(ex.Message);}Console.Read();}}}
Это ... совершенно не относится к делу, на вопрос, на который точно ответили 3 года назад.
Nyerguds
2
Это верный пример. Избыток может быть, но не в этом суть. +1
Адам
1
@ Adam: это очень конкретная реализация того ответа, который был дан уже три года назад, на вопрос, который изначально не касался какой-либо конкретной реализации. Не понимаю, насколько это конструктивно.
Nyerguds
@Nyerguds, тогда у нас есть разные определения «не по теме», что неудивительно, поскольку это субъективный термин.
Адам
@ Nyerguds, если это не имеет отношения к тебе, то это нормально. Некоторым нравится многословие, потому что это помогает им находить «реальные» реализации кода «образец / пример». Переименовывает файл (ы). Как это не относится к делу, в значительной степени, как сказал Адам, это субъективно. По какой-то причине вы чувствуете, что это абсолютно объективно. Ну да ладно, каждому свое. Спасибо за вклад, так или иначе.
MicRoc
6
С надеждой! это будет полезно для вас. :)
publicstaticclassFileInfoExtensions{/// <summary>/// behavior when new filename is exist./// </summary>publicenumFileExistBehavior{/// <summary>/// None: throw IOException "The destination file already exists."/// </summary>None=0,/// <summary>/// Replace: replace the file in the destination./// </summary>Replace=1,/// <summary>/// Skip: skip this file./// </summary>Skip=2,/// <summary>/// Rename: rename the file. (like a window behavior)/// </summary>Rename=3}/// <summary>/// Rename the file./// </summary>/// <param name="fileInfo">the target file.</param>/// <param name="newFileName">new filename with extension.</param>/// <param name="fileExistBehavior">behavior when new filename is exist.</param>publicstaticvoidRename(thisSystem.IO.FileInfo fileInfo,string newFileName,FileExistBehavior fileExistBehavior =FileExistBehavior.None){string newFileNameWithoutExtension =System.IO.Path.GetFileNameWithoutExtension(newFileName);string newFileNameExtension =System.IO.Path.GetExtension(newFileName);string newFilePath =System.IO.Path.Combine(fileInfo.Directory.FullName, newFileName);if(System.IO.File.Exists(newFilePath)){switch(fileExistBehavior){caseFileExistBehavior.None:thrownewSystem.IO.IOException("The destination file already exists.");caseFileExistBehavior.Replace:System.IO.File.Delete(newFilePath);break;caseFileExistBehavior.Rename:int dupplicate_count =0;string newFileNameWithDupplicateIndex;string newFilePathWithDupplicateIndex;do{
dupplicate_count++;
newFileNameWithDupplicateIndex = newFileNameWithoutExtension +" ("+ dupplicate_count +")"+ newFileNameExtension;
newFilePathWithDupplicateIndex =System.IO.Path.Combine(fileInfo.Directory.FullName, newFileNameWithDupplicateIndex);}while(System.IO.File.Exists(newFilePathWithDupplicateIndex));
newFilePath = newFilePathWithDupplicateIndex;break;caseFileExistBehavior.Skip:return;}}System.IO.File.Move(fileInfo.FullName, newFilePath);}}
Как использовать этот код?
classProgram{staticvoidMain(string[] args){string targetFile =System.IO.Path.Combine(@"D://test","New Text Document.txt");string newFileName ="Foo.txt";// full patternSystem.IO.FileInfo fileInfo =newSystem.IO.FileInfo(targetFile);
fileInfo.Rename(newFileName);// or short formnewSystem.IO.FileInfo(targetFile).Rename(newFileName);}}
using System.IO;string oldFilePath =@"C:\OldFile.txt";// Full path of old filestring newFilePath =@"C:\NewFile.txt";// Full path of new fileif(File.Exists(newFilePath)){File.Delete(newFilePath);}File.Move(oldFilePath, newFilePath);
Если вы собираетесь это сделать, я бы посоветовал проверить, что «oldFilePath» существует, прежде чем что-либо делать ... иначе вы удалите «newFilePath» без всякой причины.
Джон Кротч
Это даже компилировать ( Using System.IO;)?
Питер Мортенсен
3
В моем случае я хочу, чтобы имя переименованного файла было уникальным, поэтому я добавляю к нему метку даты и времени. Таким образом, имя файла «старого» журнала всегда уникально:
Я сталкивался со случаем, когда мне приходилось переименовывать файл в обработчике событий, который инициировал любое изменение файла, включая переименование, и пропустить навсегда переименование файла, который мне пришлось переименовать, с помощью:
Делать его копию
Удаление оригинала
File.Copy(fileFullPath, destFileName);// both has the format of "D:\..\..\myFile.ext"Thread.Sleep(100);// wait OS to unfocus the file File.Delete(fileFullPath);
На всякий случай, если у кого-то будет такой сценарий;)
int rename(constchar* oldname,constchar* newname);
Функция rename () определена в заголовочном файле stdio.h. Переименовывает файл или каталог со старого имени на новое. Операция переименования аналогична перемещению, поэтому вы также можете использовать эту функцию для перемещения файла.
Добро пожаловать. Этот вопрос касается переименования файла с использованием языка C #. Я не уверен, как указание чего-то из стандартной библиотеки C (не C #) помогает здесь.
Джефф Даммейер
-10
Когда C # не имеет какой-либо функции, я использую C ++ или C:
publicpartialclassProgram{[DllImport("msvcrt",CallingConvention=CallingConvention.Cdecl,SetLastError=true)]publicstaticexternint rename([MarshalAs(UnmanagedType.LPStr)]string oldpath,[MarshalAs(UnmanagedType.LPStr)]string newpath);staticvoidFileRename(){while(true){Console.Clear();Console.Write("Enter a folder name: ");string dir =Console.ReadLine().Trim('\\')+"\\";if(string.IsNullOrWhiteSpace(dir))break;if(!Directory.Exists(dir)){Console.WriteLine("{0} does not exist", dir);continue;}string[] files =Directory.GetFiles(dir,"*.mp3");for(int i =0; i < files.Length; i++){string oldName =Path.GetFileName(files[i]);int pos = oldName.IndexOfAny(newchar[]{'0','1','2'});if(pos ==0)continue;string newName = oldName.Substring(pos);int res = rename(files[i], dir + newName);}}Console.WriteLine("\n\t\tPress any key to go to main menu\n");Console.ReadKey(true);}}
Ответы:
Взгляните на System.IO.File.Move , «переместите» файл под новым именем.
источник
источник
В методе File.Move он не будет перезаписывать файл, если он уже существует. И это бросит исключение.
Поэтому нам нужно проверить, существует ли файл или нет.
Или окружите его попыткой, чтобы избежать исключения.
источник
Вы можете использовать,
File.Move
чтобы сделать это.источник
Просто добавь:
А потом...
источник
Первое решение
Избегайте
System.IO.File.Move
размещенных здесь решений (отмеченный ответ включен). Это терпит неудачу по сетям. Однако шаблон копирования / удаления работает локально и по сетям. Воспользуйтесь одним из решений для перемещения, но замените его на «Копировать». Затем используйте File.Delete, чтобы удалить исходный файл.Вы можете создать метод Rename, чтобы упростить его.
Простота использования
Используйте сборку VB в C #. Добавить ссылку на Microsoft.VisualBasic
Затем переименовать файл:
Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(myfile, newName);
Обе строки. Обратите внимание, что myfile имеет полный путь. newName не имеет. Например:
C:\whatever\
Папка теперь будет содержатьb.txt
.источник
smb
),ftp
,ssh
или что - то все есть команды / примитивы для файла перемещения / переименования , если не допускается (например , только для чтения).Вы можете скопировать его как новый файл, а затем удалить старый, используя
System.IO.File
класс:источник
ПРИМЕЧАНИЕ. В этом примере кода мы открываем каталог и ищем PDF-файлы с открытыми и закрытыми круглыми скобками в имени файла. Вы можете проверить и заменить любой символ в имени, которое вам нравится, или просто указать новое имя, используя функции замены.
Есть и другие способы работы с этим кодом, чтобы сделать более сложные переименования, но моим главным намерением было показать, как использовать File.Move для пакетного переименования. Это работало против 335 файлов PDF в 180 каталогах, когда я запускал его на своем ноутбуке. Это подстегнуть момент кода, и есть более сложные способы сделать это.
источник
Как использовать этот код?
источник
Использование:
источник
Using System.IO;
)?В моем случае я хочу, чтобы имя переименованного файла было уникальным, поэтому я добавляю к нему метку даты и времени. Таким образом, имя файла «старого» журнала всегда уникально:
источник
Move делает то же самое = Копировать и удалить старый.
источник
Я не мог найти подход, который мне подходит, поэтому я предлагаю свою версию. Конечно нужен ввод, обработка ошибок.
источник
источник
Я сталкивался со случаем, когда мне приходилось переименовывать файл в обработчике событий, который инициировал любое изменение файла, включая переименование, и пропустить навсегда переименование файла, который мне пришлось переименовать, с помощью:
На всякий случай, если у кого-то будет такой сценарий;)
источник
Функция rename () определена в заголовочном файле stdio.h. Переименовывает файл или каталог со старого имени на новое. Операция переименования аналогична перемещению, поэтому вы также можете использовать эту функцию для перемещения файла.
источник
Когда C # не имеет какой-либо функции, я использую C ++ или C:
источник