Здравствуйте!
Необходимо заменить файл, если он используется в данный момент времени, до замена происходит после перезагрузки...
Есть ли замена функции MoveFileEx в .NET?
TIA
Владея информацией, владеешь миром. Уинстон Черчилль
От:
Closer
Дата: 24.07.08 14:28
Оценка:
Здравствуйте, DioNNis, Вы писали:
[skipped]
FileInfo.MoveTo или FileInfo.Replace
Мы были здесь. Но пора идти дальше. (с) Дуглас Коупленд, Рабы "Микрософт"
При вызове функции возвращается 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();
Владея информацией, владеешь миром. Уинстон Черчилль
Здравствуйте, 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>>
Здравствуйте, AndrewVK, Вы писали:
AVK>1) Чтобы получить правильное значение GetLastError, нужно в атрибуте DllImport установить поле SetLastError.
AVK>2) Строки пометь атрибутом MarshalAs и укажи тип UnmanagedType.LPTStr
GetLastError работает!!!!
Не работает MoveFileEx =(
Просто я написал, что бы было понятно, что за ошибка получается.... =)
Владея информацией, владеешь миром. Уинстон Черчилль
Здравствуйте, DioNNis, Вы писали:
http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx.html ... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, DioNNis, Вы писали:
Z>http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx.html
Спасибо! Проблема в флагах оказалась... =(
Владея информацией, владеешь миром. Уинстон Черчилль
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить