File delete не удаляет файл
Я пытаюсь написать SQL, который удалит файлы типа .7z старше 7 дней.
Вот что у меня не работает:
Я также пробовал изменить «1» в конце на «0».
Это возвращает «успех», но файлы не удаляются.
Я использую SQL Server 2005, Standard, с пакетом обновления 2 (SP2)
Была похожая проблема, нашел разные ответы. Вот что я нашел.
Вы не можете удалить файлы 7z с помощью xp_delete_file. Это недокументированная расширенная хранимая процедура, оставшаяся после SQL 2000. Она проверяет первую строку удаляемого файла, чтобы убедиться, что это либо файл резервной копии SQL, либо файл отчета SQL. Он не проверяет в зависимости от расширения файла. Насколько я понимаю, его предполагаемое использование заключается в планах обслуживания для очистки старых резервных копий и составления отчетов.
Вот пример, основанный на ссылке Tomalak для удаления файлов резервных копий старше 7 дней. Что сбивает людей с толку, так это схема sys, косая черта в конце пути к папке и отсутствие точки в расширении файла, которую нужно искать. Пользователь, от имени которого работает SQL Server, также должен иметь разрешения на удаление папки.
Поскольку это недокументировано, xp_delete_file может исчезнуть или измениться в будущих версиях SQL Server. Многие сайты рекомендуют сценарий оболочки для выполнения удаления.
AFAIK xp_delete_file удаляет только файлы, распознаваемые SQL Server 2005 (файлы резервных копий, журналы транзакций, . ). Возможно, вы можете попробовать что-то вроде этого:
Smink: Я безуспешно пытался изменить расширение файла на .bak. Он смотрит в файл, чтобы увидеть, не возился ли я с ним, вместо того, чтобы просто смотреть на расширение?
Этот sp удалит только собственные файлы резервных копий сервера sql или файлы отчетов об обслуживании (в целях безопасности).
Как предложил Smink, вы можете использовать
С соответствующими разрешениями в папке.
Я нашел этот вопрос, но решение не применимо ко мне (поскольку это были файлы .bak, сам SQL Server создал как часть плана обслуживания).
В моем случае проблема заключалась в безопасности. Сценарий запускался как пользователь, запускающий SQL Server (MSSQL) (в моем случае и, вероятно, в большинстве случаев «сетевая служба»), не имел доступа к папке, в которой он пытался удалить файлы.
Так что добавление «сетевой службы» и предоставление ей «модификации» помогло.
Я прочитал множество различных подходов и решений, которые использовали несколько человек, пытаясь решить проблему с помощью расширенной хранимой процедуры xp_delete. Решения:
- Обязательно НЕ ставьте точку (.) В расширении при настройке задачи обслуживания SSIS.
- Обязательно щелкните Включить подпапки первого уровня, если они существуют для каждой резервной копии базы данных.
- Обязательно нажмите на файлы резервных копий вверху. Задача обслуживания проверяет тип файла. Для резервного копирования базы данных я считаю, что он проверяет заголовок файла резервной копии.
В моем сценарии все вышеперечисленное было правильным. В сети есть несколько комментариев, в которых некоторые из заявлений о том, что процедура xp_delete содержит ошибки.
Для проверки базы данных использовались следующие команды базы данных:
Обе приведенные выше команды указали, что файл резервной копии действителен.
* Описание для события с кодом 17052 из исходного MS SQL SERVER не найдено. Либо компонент, вызывающий это событие, не установлен на вашем локальном компьютере, либо установка повреждена. Вы можете установить или восстановить компонент на локальном компьютере. Если событие возникло на другом компьютере, отображаемую информацию нужно было сохранить вместе с событием.
Следующая информация была включена в мероприятие:
Уровень серьезности: 16 Ошибка: 18456, ОС: 18456 [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Server] Ошибка входа для пользователя 'domain \ servername $'. *
Следующим шагом было сравнение безопасности базы данных, где xp_delete работал, с базой данных, где он не работал. В базе данных было 2 пропущенных имени входа в систему безопасности, где xp_delete не работал. Два отсутствующих имени входа: NT AUTHORITY \ SYSTEM NT Service \ MSSQLSERVER
После добавления NT service \ MSSQLSERVER, xp_delete успешно заработал.
Один из подходов к тестированию - использовать задачу обслуживания для удаления отдельного файла.
Итак, некоторые консультанты настроили это в нашей компании и, по-видимому, добавили .bak для расширения. После удаления периода "запекать" все работает нормально. Спасибо.
Попробуйте изменить первый параметр с 0 на 1.
Вот небольшой обзор xp_delete_file I только что нашел. Похоже, вам не повезет с этой процедурой.
Я знаю, что это немного устарело, но я хотел поделиться своим разочарованием со всеми вами. У меня была та же проблема, что и у многих этих постов, но, похоже, ничего не работало. Затем я вспомнил, что у нас есть уровень шифрования в базе данных под названием NetLib. Это означает, что резервные копии зашифрованы, и поэтому xp_delete_file не может читать заголовки. Теперь я использую пакетный файл в ОС и вызываю его из задания агента. Надеюсь, это кому-то поможет.
Обычно мы попадаем в такие ситуации, когда база данных перемещается на другой сервер или когда экземпляр SQL переустанавливается на том же сервере, а резервная копия остается в старом каталоге. Например: вы перемещаете базу данных с server1 на server2, но у вас есть сервер с планом обслуживания, который выполняет периодическое резервное копирование, или вы переустанавливаете экземпляр SQL на server1 и восстанавливаете базу данных.
В случае резервного копирования наборы, которые хранятся в виде информации в msdb, больше не существуют, поэтому все старые резервные копии, которые были созданы, не будут удалены, поскольку не проверяется информация из сбоев, полученных из таблиц с наборами резервных копий.
Дополнительные сведения: Невозможно создать файл, так как он уже существует.
Я так понял, что это из-за того, что File.Delete(file_name + ".bak") почему то не удалил файл?
А как вообще узнать, правильно ли сработал File.Delete? После него еще раз проверять существование файла?
Как вообще правильно переименовать старый файл в [Файл].bak перед тем как писать данные в [Файл]?
File.Delete (Graphics.FromImage)
Image img = new Bitmap(790, 1230); Graphics g = Graphics.FromImage(img); .
Удаление файла. File.Create() - File.Delete()
Добрый день! Не нашёл вразумительного ответа на свой вопрос. Создаю файл (File.Create()) и при.
Случайно удалил проект через Directory.Delete(), возможности восстановления
В моём проекте находилась папка, содержимое которой постоянно менялось, поэтому при запуске я.
File.Delete пробел в имени
Произвожу удаление private string programName = "Неполные семьи.exe";.
У File.Move есть перегрузка, где третий параметр по-моему Rewrite, поэтому удалять файл необязательно.
Добавлено через 4 минуты
Извиняюсь, перепутал с File.Copy
Ага.
Варианта два:
1. Проверяется один файл, а удаляется другой — смотрите генерируемые пути.
2. После проверки и перед перемещением файл был создан заново — смотрите что у вас с потоками.
Если исключение не вылетело, то сработал.
Как сделать так, чтобы bat-файл удалил файл рядом с собой и удалил сам себя?
Здравствуйте! --------------- Подскажите как сделать bat-файл, чтобы он сам себя удалял. .
Случайно удалил проект через Directory.Delete(), возможности восстановления
Среда: Visual Studio 2017, проект: Windows Presentation Foundation. В моём проекте находилась.
PHP universal delete file
Какие могут быть недостатки у кода ниже ? Предоставление удаления файла передаётся через заранее.
Удалил pas файл
в общем удалил pas файл. остался dfm - object setUsers: TADOQuery Active = True .
У меня проблема такого рода: я пытаюсь использовать функцию DeleteFile, однако она наотрез отказывается удалять один файл. Он просто остается на месте и все. При этом, когда я пытаюсь удалить его программно, из других проектов в Delphi, все норм. Что ересь?
P.S. Походила по Инету, оказывается не у меня одной такие проблемы. Похоже, эта функция вообще ненадежна.
DeleteFile как удалить?
Как удалить файлы в папке,если не знаешь имя и его параметры(.txt,.exe) он или что-то такое.
Почему не получается удалить file? Как удалить файл?
почему не получается удалить file? public void onClick(View v) < .
Почему в Samba пользователь может удалить не свою папку?
Разъясните пожалуйста как этот сервер работает существует папка /home/smb/test имеет параметр.
Почему может не запускаться .exe файл?
Всем привет! Такой вопрос немного странный. Я написал программу. Она компилируется и всё.
Именно "наотрез"?
А вы читали справку по данной функции? Заметили и учли следующее?:
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
По интернету ходят в основном троешники, которые не хотят читать справочную литературу. Но хотят надыбать код.
И разумеется у всех у них проблемы.
Именно "наотрез"?
А вы читали справку по данной функции? Заметили и учли следующее?:
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
И что это должно означать, интересно? Что функция в случае нормальной работы не равна нулю, а в случае ошибки равна? Спасибо, это и так понимаю.
Проблема в том, что программа не выдает никакой ошибки. И попытка вызвать GetLastError, ничего не дает, потому что никакой ошибки нет. Программа просто не удаляет файл.
Добавлено через 14 минут
Короче, разобралась. Код ошибки - 5, что бы это ни значило.
По интернету ходят в основном троешники, которые не хотят читать справочную литературу. Но хотят надыбать код.
И разумеется у всех у них проблемы.
Рассмотрим следующий пример класса Java (ниже pom.xml):
Я пишу в FileOutputStream и пытаюсь удалить файл позже, не закрывая сначала поток . Это была моя первоначальная проблема, и, конечно, она была неправильной, но она приводит к некоторым странным наблюдениям.
Когда вы запускаете основной метод в Windows 7, он дает следующий результат:
- Почему первый вызов Files.delete () не вызывает исключения?
- Почему следующий вызов Files.exist () возвращает false?
- Почему невозможно создать файл заново?
Что касается последнего вопроса, я заметил, что файл все еще виден в проводнике, когда вы останавливаетесь на точке останова 1. Когда вы завершаете JVM, файл все равно будет удален. После закрытия потока deleteAndCheck () работает должным образом.
Мне кажется, что удаление не распространяется на ОС до закрытия потока, и API файлов не отражает это должным образом.
Может кто-нибудь точно объяснить, что здесь происходит?
pom.xml
Обновление для уточнения
Файл исчезает в проводнике Windows, если поток закрывается И вызывается Files.delete () - запускается последняя операция - или если Files.delete () был вызван без закрытия потока и JVM завершена.
2 ответа
Можно ли удалить открытый файл?
Совершенно верно удалить запись в каталоге файла при открытии файла. В Unix это семантика по умолчанию, и Windows ведет себя аналогично, если FILE_SHARE_DELETE устанавливается для всех дескрипторов файлов, открытых для этого файла.
[Edit: Спасибо @couling за обсуждения и исправления]
Однако есть небольшая разница: Unix удаляет файл name немедленно , тогда как Windows удаляет имя файла только после закрытия последнего дескриптора . Однако это не позволяет вам открыть файл с тем же именем, пока последний дескриптор (удаленного) файла не будет закрыт.
Однако в обеих системах удаление файла не обязательно приводит к его удалению, он по-прежнему занимает место на диске до тех пор, пока есть открытый дескриптор для него. Место, занятое файлом, освобождается только после закрытия последнего открытого дескриптора.
Экскурсия: Windows
Из-за того, что необходимо указать флаг в Windows, большинству людей кажется, что Windows не может удалять открытые файлы, но на самом деле это не так. Это просто поведение по умолчанию .
Позволяет последующим операциям открытия файла или устройства запрашивать доступ для удаления.
В противном случае другие процессы не могут открыть файл или устройство, если они запрашивают доступ для удаления.
Если этот флаг не указан, но файл или устройство были открыты для доступа на удаление, функция не выполняется. Примечание. Доступ к удалению позволяет выполнять операции как удаления, так и переименования.
Функция DeleteFile помечает файл для удаления при закрытии. Поэтому удаление файла не происходит до тех пор, пока последний дескриптор файла не будет закрыт. Последующие вызовы CreateFile для открытия файла завершаются с ошибкой ERROR_ACCESS_DENIED.
Наличие открытого дескриптора файла без имени - один из наиболее типичных методов создания безымянных временных файлов: создайте новый файл, откройте его, удалите файл. Теперь у вас есть дескриптор файла, который никто не может открыть. В Unix имя файла действительно отсутствует, а в Windows вы не можете открыть файл с таким же именем.
Имеет ли Files.newOutputStream () установить FILE_SHARE_DELETE ?
Глядя на источник, вы можете видеть, что shareDelete действительно по умолчанию равен true . Единственный способ сбросить его - использовать нестандартный ExtendedOpenOption NOSHARE_DELETE .
Итак, да, вы можете удалять открытые файлы в Java, если они явно не заблокированы.
Почему я не могу воссоздать удаленный файл?
Ответ на этот вопрос скрыт в документации к DeleteFile() выше: файл помечен только для удаления, файл все еще существует. В Windows вы не можете создать файл с именем файла, помеченного для удаления, пока файл не будет должным образом удален, то есть все дескрипторы файла не будут закрыты.
Возможная путаница между удалением имени и фактическим удалением файлов, вероятно, является причиной того, что Windows вообще запрещает удаление открытых файлов по умолчанию.
Почему Files.exists() возвращает false ?
Files.exists() в глубоком конце в Windows открывает этот файл в какой-то момент, и мы уже знаем, что мы не можем повторно открыть удаленный, но все еще открытый файл в Windows .
Существует также другой путь кода, который вызывает GetFileAttributeEx() , чтобы получить атрибуты файла. Опять же, не задокументировано, что происходит, когда вы пытаетесь получить атрибуты удаленного, но еще не удаленного файла, но действительно, вы не можете получить атрибуты файла, помеченного для удаления. .
Догадываясь, я бы сказал, что GetFileAttributeEx() вызывает GetFileInformationByHandle() в какой-то момент, до которого он никогда не доберется, потому что он вообще не может получить дескриптор файла.
Итак, действительно, после DeleteFile() файл исчезает для большинства практических целей. Однако у него все еще есть имя, которое отображается в списках каталогов, и вы не можете открыть файл с тем же именем, пока исходный файл не закроет все его дескрипторы.
Такое поведение более или менее согласовано, потому что использование GetFileAttributes() для проверки существования файла на самом деле проверка доступности файла , которая интерпретируется как файл существует . FindFirstFile() (используется проводником Windows для определения списка файлов) находит имена файлов, но ничего не сообщает вам о доступности имен.
Если Files.delete не сгенерировал исключение, это означает, что он удалил файл. В файле Files.delete javadoc говорится, что «в некоторых операционных системах невозможно удалить файл, когда он открыт и используется этой виртуальной машиной Java или другими программами».
В настоящее время мне нужно удалить файл, но он не работает. Я подумал, что это могут быть проблемы с разрешением или что-то в этом роде, но это не так. Файл, который я тестирую, пуст и существует, поэтому не знаю, почему он не удаляет его.
Любая помощь будет очень признательна!
Теперь у меня есть:
Чтобы попытаться найти правильный путь во время выполнения, чтобы при переносе программы на другой компьютер она все равно нашла файл.
Обязательно найдите свой текущий рабочий каталог и укажите путь к нему относительно него.
. распечатает этот каталог.
Кроме того, не связанного с вашим вопросом, попробуйте использовать File.separator , чтобы оставаться независимым от ОС. Обратные косые черты работают только в Windows.
Проблема также может быть связана с любыми выходными потоками, которые вы забыли закрыть. В моем случае я работал с файлом до того, как файл был удален. Однако в одном месте файловых операций я забыл закрыть выходной поток, который я использовал для записи в файл, который позже пытались удалить.
У меня та же проблема! потом понял, что моя директория не пуста. Я нашел решение в другом потоке: невозможно удалить каталог через Java
Подозреваю, что проблема в том, что путь неверный. Попробуй это:
Попробуйте закрыть все FileOutputStream/FileInputStream , которые вы открыли ранее другими методами, а затем попробуйте удалить, работает как шарм.
В моем случае это был close (), который не выполнялся из-за необработанного исключения.
Предположим, что в parse () генерируется исключение, которое не обрабатывается в этом методе, и поэтому файл не закрывается, в дальнейшем файл удаляется, и этот оператор удаления завершается с ошибкой, и не удаляйте.
Итак, вместо этого у меня был такой код, и он сработал .
Так базовая Java, которую иногда упускают из виду.
Я сделал ошибку, открыв BufferedReader, например:
. и, конечно же, я не смог выполнить f.delete() , потому что я обернул FileReader вместо того, чтобы создавать собственную переменную, где я мог бы ее явно закрыть. Ах .
Однажды я закодировал:
Я мог выдать br.close(); br=null; fread.close(); fread=null; и f.delete() работал нормально.
В моем случае я обрабатывал набор файлов jar, содержащихся в каталоге. После того, как я их обработал, я попытался удалить их из этого каталога, но они не удалялись. Я использовал JarFile для их обработки, и проблема заключалась в том, что я забыл закрыть JarFile, когда закончил.
Поскольку каталог не пуст, file.delete () всегда возвращает false.
который доступен в Kotlin и удалит полностью напрямую и вернет логический ответ, как это делает file.delete ().
Если все еще не работает, вы можете вызвать сборщик мусора, чтобы закрыть файл и освободить память.
Не забудьте закрыть этот файл, если он уже открывался с помощью фрагмента кода fio.close() Тестировал на Java 1.8, работает хорошо.
Если вы хотите удалить файл, сначала закройте все соединения и потоки. после этого удалите файл.
Читайте также: