проблема с временными файлами
От: jyuyjiyuijyu  
Дата: 11.03.14 18:58
Оценка:
Всем привет

создаю временный файл в temp директории

auto_handle<FileStream> file(gcnew FileStream(path, 
        FileMode::Create, FileAccess::Write, FileShare::Read, Int16::MaxValue, FileOptions::DeleteOnClose));


нужно не удалять файл если он записался успешно... как можно отключить флаг DeleteOnClose
и переместить файл из папки temp в нужное место ?

я знаю что можно сделать File::Copy но это ужасно медленно на больших файлах или при больших объемах...
нужно именно делать File::Move без всякого копирования... но сначала нужно его закрыть перед File::Move
а он собака тут же удаляется с этим флагом...

вообщем посоветуйте как победить зло...

еще известно что на native api уровне этот флаг известен как FILE_FLAG_DELETE_ON_CLOSE
может этот флаг нативными функциями можно как то сбросить ?

спасибо
Re: проблема с временными файлами
От: cvetkov  
Дата: 11.03.14 22:08
Оценка:
а не проще его удалять в ручную если чтото пошло не так?
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[2]: проблема с временными файлами
От: jyuyjiyuijyu  
Дата: 12.03.14 00:25
Оценка:
Здравствуйте, cvetkov, Вы писали:

C>а не проще его удалять в ручную если чтото пошло не так?


прогу могут прибить из диспетчера задачь и тогда ой... да и удобно это когда файл сам
самоликвидируется во всех случаях кроме удачного финиша...
Re: проблема с временными файлами
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.03.14 05:22
Оценка: 44 (8)
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>нужно не удалять файл если он записался успешно... как можно отключить флаг DeleteOnClose

J>и переместить файл из папки temp в нужное место ?
Всё тривиальное — просто, если у вас NTFS.
Отключить флаг — невозможно. Зато можно сделать вот так:
    class Program {
        static void Main(string[] args) {
            var TempFileName = Path.GetTempFileName();
            var f = new FileStream(TempFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 512, FileOptions.DeleteOnClose);
            using (var w = new StreamWriter(f)) {
                w.WriteLine("Hello world!");
                CreateHardLink(@"C:\Users\azlygostev\Documents\MyTempFile.txt", TempFileName, 0);
            }
        }

        [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
        static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, UInt32 lpSecurityAttributes);
    }

Вкратце, идея — в следующем:
1. Временный файл открывается с флагом DeleteOnClose, поэтому он исчезает всегда
2. В случае, если нужно его где-то сохранить, то до его закрытия создаётся ещё одна файловая запись в каталоге, которая указывает на те же данные. С нулевым оверхедом на копирование.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: проблема с временными файлами
От: jyuyjiyuijyu  
Дата: 12.03.14 09:51
Оценка:
Здравствуйте, Sinclair, Вы писали:

да работает идеально! премного благодарен
Re[3]: проблема с временными файлами
От: cvetkov  
Дата: 12.03.14 10:43
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

C>>а не проще его удалять в ручную если чтото пошло не так?


J>прогу могут прибить из диспетчера задачь и тогда ой... да и удобно это когда файл сам

J>самоликвидируется во всех случаях кроме удачного финиша...

я не уверен что в этом сценарии файл удалится. хотя если не удалится ничего страшного, это же темп.
а про удобно я вообще не понял в вашем сценарии неоходимы странные танцы. где удобство?
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[4]: проблема с временными файлами
От: jyuyjiyuijyu  
Дата: 12.03.14 11:02
Оценка:
Здравствуйте, cvetkov, Вы писали:

C>я не уверен что в этом сценарии файл удалится. хотя если не удалится ничего страшного, это же темп.

C>а про удобно я вообще не понял в вашем сценарии неоходимы странные танцы. где удобство?

удалится я проверял

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