c# Создать уникальное имя с GUID

Я создаю резервное решение. Я сомневаюсь, что есть что-то новое в том, чего я пытаюсь достичь.

Перед копированием файла я хочу сделать резервную копию целевого файла на случай, если что-то испортится. Это означает переименование файла.

Я должен быть осторожен при переименовании, если файл уже существует и добавление 01 в конец небезопасно.

Мой вопрос, основанный на том, что я не нашел ответа в другом месте, будет ли работать добавление GUID к имени файла. Итак, если бы мой файл назывался file01.txt, переименовав файл в file01.txtGUID (где GUID — это сгенерированный GUID), я мог бы затем выполнить резервное копирование этого файла (в данном случае с двумя резервными копиями), а затем, после убедившись, что файл скопирован (путем сравнения длины файла с источником), удалите файл с GUID в имени.

Я знаю, что GUID не на 100% гарантированно уникален, но будет этого достаточно?


person Dave    schedule 13.10.2012    source источник


Ответы (4)


Просто получите GUID, а затем спросите целевую ОС, существует ли имя + GUID. Если это так, выберите новый GUID и повторите попытку. Вы все равно собираетесь удалить файл name+GUID, так что кого это волнует, если вы не можете выбрать уникальное имя файла с первой попытки.

Я думаю, что вы можете сосредоточиться на неправильных проблемах, учитывая риск и последствия.

Что делать, если у вас нет места на диске для создания двух резервных копий в целевой системе?

Что делать, если имя файла + путь слишком длинные для целевой ОС?

Что кто-то еще изменяет файл в промежутке времени между получением имени и попыткой выполнить операцию времени над файлом?

Написание защитного кода — это размышление о рисках, но не сводите себя с ума, сосредотачиваясь на менее вероятных или почти невозможных сценариях.

person Jason    schedule 13.10.2012
comment
Я согласен, - место на диске может быть проблемой, и я думал об этом, и, поскольку это только на W7, я надеялся, что GUID не будет проблемой, но я благодарен за ваши комментарии. На данный момент это образовательный проект, который я поставил перед собой, но если бы я хотел его расширить, мне пришлось бы учитывать эти моменты. Спасибо +1 - person Dave; 13.10.2012

Почему бы вам просто не использовать GetTempFileName()? Вот для чего это нужно;

http://msdn.microsoft.com/en-us/library/system.io.path.gettempfilename.aspx

person cirrus    schedule 13.10.2012
comment
Потому что я не знал об этом :) Спасибо (+1) это здорово... Так много фреймворка, так мало времени... - person Dave; 14.10.2012

Да этого хватило бы. С квантовой механикой нет ничего невозможного, и теоретически через миллион лет вы сможете случайно воспроизвести GUID, но поскольку вы также добавляете имя файла, это еще более невозможно. Конечно, вы также можете добавить размер файла в байтах или хэш файла, но помните, что в Windows длина пути не бесконечна.

Guid.NewGuid()

если твой друг.

person Akku    schedule 13.10.2012
comment
Спасибо - Да, это была и моя мысль, но у меня было много мыслей только для того, чтобы ошибиться :) спасибо, что нашли время - person Dave; 13.10.2012

Он глобально уникален, уникален во Вселенной. Сообщение, которое вы цитируете, является шуткой.

person Mark Sowul    schedule 13.10.2012
comment
Спасибо, это ответ. Я на самом деле думал, что пост был настоящим (все еще многому учусь!) - person Dave; 13.10.2012
comment
Нет таких гарантий, что он уникальный. Они достаточно уникальны, чтобы считаться уникальными, и подходят для этой цели, но они совершенно точно не могут быть уникальными во вселенной, поскольку основаны на случайных числах. MS использует V4 спецификации Guid. Документы не дают таких гарантий. - person cirrus; 13.10.2012
comment
Они вероятностно уникальны. Если вы хотите поспорить о 0,0000000000000000000000000000000000001% вероятности столкновения, дерзайте, но я не собираюсь тратить свое время на беспокойство об этом. blogs.msdn.com/ b/ericlippert/архив/2012/05/07/ - person Mark Sowul; 13.10.2012
comment
Истинный. Но ваш ответ был излишне грубым, я чувствовал, поэтому я чувствовал себя педантичным. ИМХО, это также наименее полезный ответ из всех и не заслуживающий принятия. - person cirrus; 13.10.2012
comment
Грубо как? Вопрос основан на ложном предположении, что идентификаторы GUID не уникальны, потому что цитируемое сообщение — это шутка, которую восприняли как серьезную. - person Mark Sowul; 13.10.2012
comment
Я не думаю, что это была шутка, включая вас, и у вопроса был другой контекст, который вызвал еще несколько полезных предложений. Парень просто попросил разъяснений. Ваш краткий ответ был бесполезен и в значительной степени бесполезен. Я думаю, вы только что унизили бедного парня, заставив его согласиться, но не потому, что это был полезный ответ по сравнению с любым другим здесь. - person cirrus; 14.10.2012
comment
Я уточнил, что его GUID будут уникальными. Сообщение, которое цитирует OP, stackoverflow.com/questions/1705008, является шуткой! Я не знаю, что еще тебе сказать. Видите ли вы все, что связано с тепловой смертью Вселенной, ожиданием нескольких триллионов лет и т. д.? Вы понимаете математику, стоящую за GUID? - person Mark Sowul; 14.10.2012
comment
Если не грубо, то конечно резко, но молодец, что не хамишь здесь в комментариях. - person cirrus; 15.10.2012