Аналог MoveFileEx
От: DioNNis http://i-liger.com
Дата: 24.07.08 13:53
Оценка:
Здравствуйте!

Необходимо заменить файл, если он используется в данный момент времени, до замена происходит после перезагрузки...
Есть ли замена функции MoveFileEx в .NET?


TIA
Владея информацией, владеешь миром. Уинстон Черчилль
Re: Аналог MoveFileEx
От: Closer  
Дата: 24.07.08 14:28
Оценка:
Здравствуйте, DioNNis, Вы писали:

[skipped]
FileInfo.MoveTo или FileInfo.Replace
Мы были здесь. Но пора идти дальше. (с) Дуглас Коупленд, Рабы "Микрософт"
Re: Аналог MoveFileEx
От: DioNNis http://i-liger.com
Дата: 25.07.08 07:50
Оценка:
При вызове функции возвращается false. GetLastError возвращает код "2".

ERROR_FILE_NOT_FOUND
2
The system cannot find the file specified.


Поскажите пожалуйста, что я не так делаю?

Объявление функции:

public enum MoveFileExFlag
    {
        MOVEFILE_COPY_ALLOWED           = 2,
        MOVEFILE_CREATE_HARDLINK        = 16,
        MOVEFILE_DELAY_UNTIL_REBOOT     = 4,
        MOVEFILE_FAIL_IF_NOT_TRACKABLE  = 32,
        MOVEFILE_REPLACE_EXISTING       = 1,
        MOVEFILE_WRITE_THROUGH          = 8
    }

    class IMFile
    {
        //Опишем функцию, которую будем вызывать из DLL
        [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
        public static extern bool MoveFileEx(
                                              string existingFileName,
                                              string newFileName,
                                              UInt32 flags
                                            );


        [DllImport("Kernel32.dll")]
        public static extern UInt32 GetLastError();

    }



Место применения:

UInt32 errorCode;

                string temp1 = Environment.CurrentDirectory + '\\' + sourceDirectory + '\\' + fileDetail.name;
                string temp2 = destinationDirectory + '\\' + fileDetail.name;
                //File.Copy(Environment.CurrentDirectory + '\\' +  sourceDirectory + '\\' + fileDetail.name, destinationDirectory + '\\' + fileDetail.name, true);
                bool temp = IMFile.MoveFileEx(  Environment.CurrentDirectory + '\\' + sourceDirectory + '\\' + fileDetail.name, 
                                                destinationDirectory + '\\' + fileDetail.name, 
                                                2);
                if (!temp)
                    errorCode = IMFile.GetLastError();
Владея информацией, владеешь миром. Уинстон Черчилль
Re[2]: Аналог MoveFileEx
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.07.08 08:21
Оценка:
Здравствуйте, DioNNis, Вы писали:

DNN>
DNN>public enum MoveFileExFlag
DNN>    {
DNN>        MOVEFILE_COPY_ALLOWED           = 2,
DNN>        MOVEFILE_CREATE_HARDLINK        = 16,
DNN>        MOVEFILE_DELAY_UNTIL_REBOOT     = 4,
DNN>        MOVEFILE_FAIL_IF_NOT_TRACKABLE  = 32,
DNN>        MOVEFILE_REPLACE_EXISTING       = 1,
DNN>        MOVEFILE_WRITE_THROUGH          = 8
DNN>    }

DNN>    class IMFile
DNN>    {
DNN>        //Опишем функцию, которую будем вызывать из DLL
DNN>        [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
DNN>        public static extern bool MoveFileEx(
DNN>                                              string existingFileName,
DNN>                                              string newFileName,
DNN>                                              UInt32 flags
DNN>                                            );


DNN>        [DllImport("Kernel32.dll")]
DNN>        public static extern UInt32 GetLastError();

DNN>    }
DNN>


1) Чтобы получить правильное значение GetLastError, нужно в атрибуте DllImport установить поле SetLastError.
2) Строки пометь атрибутом MarshalAs и укажи тип UnmanagedType.LPTStr
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[3]: Аналог MoveFileEx
От: DioNNis http://i-liger.com
Дата: 25.07.08 10:15
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>1) Чтобы получить правильное значение GetLastError, нужно в атрибуте DllImport установить поле SetLastError.

AVK>2) Строки пометь атрибутом MarshalAs и укажи тип UnmanagedType.LPTStr

GetLastError работает!!!!
Не работает MoveFileEx =(
Просто я написал, что бы было понятно, что за ошибка получается.... =)
Владея информацией, владеешь миром. Уинстон Черчилль
Re[2]: Аналог MoveFileEx
От: Ziaw Россия  
Дата: 25.07.08 10:40
Оценка: 3 (1)
Здравствуйте, DioNNis, Вы писали:

http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx.html
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[3]: Аналог MoveFileEx
От: DioNNis http://i-liger.com
Дата: 25.07.08 11:30
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, DioNNis, Вы писали:


Z>http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx.html


Спасибо! Проблема в флагах оказалась... =(
Владея информацией, владеешь миром. Уинстон Черчилль
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.