Когда это должно хорошо проверить, существует ли файл?

В случае сбоя Word вам понадобится другой процесс для закрытия Excel.

Несколько вариантов:

  1. Показывать Excel пользователю, чтобы пользователь мог закрыть Excel objXL.visible = true
  2. Если ваш обработчик ошибок VBA работает, вы, вероятно, хотите изменить:

    objBook.ActiveWorkbook.Close
    objBook.Close
    

    на

    objBook.Close False ' Close workbook without saving changes
    objXL.Quit ' Exit Excel
    
  3. Как предложил Freeflow, есть другой процесс (например, событие таймера в Excel или отдельный процесс VBScript), который закрывает Excel, если может найти документ Word
35
задан Community 23 May 2017 в 12:06
поделиться

17 ответов

Файл. Существует метод существует, прежде всего, для тестирования на существование файла, когда Вы не намереваетесь открыть файл. Например, тестируя на существование файла блокировки, чей очень существование говорит Вам что-то, но чье содержание является несущественным.

Если Вы соберетесь открыть файл затем, то необходимо будет обработать любое исключение независимо от результатов любых предшествующих вызовов в Файл. Существует. Так, в целом нет никакого действительного значения в вызове его при этих обстоятельствах. Просто используйте соответствующую перечислимую величину FileMode в своем открытом методе и обработайте любые исключения, настолько простые.

Править: Даже при том, что это выражено с точки зрения.Net API, он основан на базовой системе API. И Windows и Unix имеют системные вызовы (т.е. CreateFile), которые используют эквивалент перечисления FileMode. На самом деле в .NET (или Моно) значение FileMode просто передается до базового системного вызова.

37
ответ дан Stephen Martin 27 November 2019 в 07:15
поделиться

Я думаю, что причина "Существует", должен определить, когда файлы отсутствуют без потребности в создании всех данных по обслуживанию ОС, требуемых получить доступ к файлу или наличию выданных исключений. Таким образом, это - оптимизация обработки файла больше, чем что-либо еще.

Для единственного файла сохранение "Существования" дает, обычно незначительно. Если бы Вы проверяли, существует ли файл многие, много раз (например, ища #include файлы) затем, сохранение могло быть значительным.

В .NET, спецификации для Файла. Существует не перечисляет исключений, которые метод мог бы выдать, в отличие от, например, Файла. Открытый, который перечисляет девять исключений, таким образом, там, конечно, меньше проверяет продолжение в первого.

Даже если "Существует", возвращает true, все еще необходимо обработать исключения при открытии файла, как ссылка .NET предполагает.

0
ответ дан Tim Cooper 27 November 2019 в 07:15
поделиться

Я думаю в любое время это, Вы знаете, что файл может или не может существовать, и Вы хотите выполнить некоторое альтернативное действие на основе существования файла, необходимо сделать проверку, потому что в этом случае это не исключительное условие для файла для не существования. Это не освободит Вас от необходимости обработать исключения - от кого-то еще или удаление или создание файла между проверкой и Вашим открытым - но это ясно дает понять намерение программы и не полагается на обработку исключений для выполнения логики управления потоком.

Править: Примером могло бы быть вращение журнала на запуске.

  try
  {
       if (File.Exists("app.log"))
       {
           RotateLogs();
       }

       log = File.Open("app.log", FileMode.CreateNew );
  }
  catch (IOException)
  {
     ...another writer, perhaps?
  }
  catch (UnauthorizedAccessException)
  {
     ...maybe I should have used runas?
  }
0
ответ дан tvanfosson 27 November 2019 в 07:15
поделиться

Как Вы указал его всегда важный, что должна сделать программа, если файл отсутствует. Во всех моих приложениях пользователь может всегда удалять файл конфигурации, и приложение создаст новый со значениями по умолчанию.Нет проблем. Я также поставляю свои приложения без файлов конфигурации.

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

То, что, должно произойти, когда файл отсутствует? Можно сделать, файл находит или обработчик исключений, но реальный вопрос: Что произойдет, когда файл будет отсутствовать? Или насколько важный файл для приложения. Я проверяю все время, прежде чем я попытаюсь получить доступ к любым файлам поддержки для приложения. Дополнительный я делаю обработку ошибок, если файл поврежден и не может быть загружен.

0
ответ дан TalkingCode 27 November 2019 в 07:15
поделиться

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

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

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

И на практике оба случая чрезвычайно вряд ли будут когда-либо подходить.

0
ответ дан DNS 27 November 2019 в 07:15
поделиться

Существуют числа возможных приложений, можно писать что простой Файл. Существует более, чем достаточно для задания. Если это - файл конфигурации, который только Ваше приложение будет использовать затем, Вы не должны идти так излишество в своей обработке исключений.

Пока "дефекты", на которые Вы указали в использовании этого метода, все допустимы, это не означает, что они не приемлемые дефекты для некоторых ситуаций.

0
ответ дан Robin Day 27 November 2019 в 07:15
поделиться

У нас есть инструмент диагностики, который должен собрать ряд файлов, включенный журнал установщика. В зависимости от различных условий журнал установщика может быть в одной из двух папок. Еще хуже, могут быть различные версии журнала в обеих из этих папок. Как инструмент находит правильный?

Это довольно просто, если Вы проверяете на существование. Если только один присутствует, захватите тот файл. Если два существуют, найдите, который имеет последнее время изменения, и захватите тот файл. Это - просто нормальный способ сделать вещи.

0
ответ дан sharptooth 27 November 2019 в 07:15
поделиться

Если Вы - то, который коснулся о ком-то еще удаляющем файл, возможно, необходимо реализовать своего рода запирающую систему. Например, я раньше работал над кодом для C-новостей, сервера новостей о Usenet. Так как много вещей, которые это сделало, могло произойти асинхронно, это "заблокирует" файл или каталог путем создания временного файла и затем трудно соединения его с файлом под названием "БЛОКИРОВКА". Если бы ссылка перестала работать, то это означало бы, что некоторая другая версия программы писала в тот каталог, иначе это было Ваше, и Вы могли сделать то, что Вы любите.

Изящная вещь об этом состоит в том, что большая часть программы была записана в оболочке и awk, и это было очень портативным механизмом блокировки. Кроме того, файл блокировки содержал бы PID владельца, таким образом, Вы могли посмотреть на существующий файл блокировки, чтобы видеть, работал ли владелец все еще.

0
ответ дан Paul Tomblin 27 November 2019 в 07:15
поделиться

Это может быть слишком упрощенно, но я думал бы, что основная причина проверки существование файла (следовательно существование.Exists ()) должна будет предотвратить непреднамеренные перезаписи существующих файлов, для не предотвращения исключений, вызванных путем попытки получить доступ к несуществующим ни недоступным файлам.

РЕДАКТИРОВАНИЕ 2

Это было, на самом деле, слишком упрощенно, и я рекомендую видеть ответ Stephen Martin.

1
ответ дан cmsjr 27 November 2019 в 07:15
поделиться

Я думаю, что проверка имеет смысл, когда Вы хотите быть уверенными, что файл был там во-первых. Как Вы сказали, что файлы настроек..., если существует файл, я попытаюсь объединить существующие настройки вместо того, чтобы сдуть их.

Другие случаи были бы, когда пользователь говорит мне делать что-то с файлом. Да я знаю, что openFileDialog проверит, существует ли файл (Но это является дополнительным). Я неопределенно remeber назад в VB6 дело было не так, так проверяя файл существовал, который они просто сказали мне использовать, было распространено.

Я не программировал бы исключением.

Править

Я не упускал суть. Вы могли бы попытаться получить доступ к файлу, исключение выдается и затем когда Вы идете для создания файла, файл был уже помещен туда. Который теперь заставляет Ваш код обработки исключений идти на неисправность. Таким образом, я предполагаю, что у нас мог затем быть обработчик исключений в нашем обработчике исключений для ловли этого файл, измененный все снова и снова...

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

Править

Дополнительно другое время для проверки на атрибуты, такие как размер - когда ожидание операции файла для окончания, да, который Вы никогда не знаете наверняка, но с хорошим algorithim и в зависимости от системы, пишущий файл, Вы смогли обрабатывать много случаев (Имел систему, работающую в течение пяти лет, которые наблюдали за маленькими файлами, прибывающими через ftp, и он использует тот же API в качестве наблюдателя файловой системы и затем начинает опрашивать ожидание файла, чтобы прекратить изменяться, прежде, чем генерировать событие, что файл готов быть использованным).

1
ответ дан JoshBerke 27 November 2019 в 07:15
поделиться

Я только проверил бы его, если я ожидаю, что это будет отсутствовать (например, параметры настройки приложения) и только если я должен считать файл.

Если я должен записать в файл, это - или файл журнала (таким образом, я могу просто добавить к нему или создать новый), или я заменяю содержание его, таким образом, я мог бы также воссоздать его так или иначе.

Если я ожидаю, что файл существует, было бы правильно, что Исключение выдается. Обработка исключений должна затем сообщить пользователю или выполнить восстановление. Мое мнение - то, что это приводит к более чистому коду.

Защита файла (т.е. не перезаписывающий (возможно важный) файлы) отличается, в этом случае я всегда проверял бы, существует ли файл, если платформа не делает этого для меня (думайте SaveFileDialog),

1
ответ дан Lennaert 27 November 2019 в 07:15
поделиться

В *отклоняют среду хорошо установленный метод для проверки, если другая копия программы уже работает, должен создать файл блокировки. Таким образом, проверка на существование файла используется для проверки этого.

1
ответ дан Sunny Milenov 27 November 2019 в 07:15
поделиться

Один пример: Вы можете проверять на существование файлов, которые Вы не можете открыть (из-за, например, полномочия).

Другой, возможно лучший пример: Вы хотите проверить на существование файла устройств Unix. Но определенно не открывайте его; открытие его имеет побочные эффекты (например, открытый/близкий /dev/st0 перемотает ленту),

2
ответ дан derobert 27 November 2019 в 07:15
поделиться

В то время как это - агностическое языком сообщение, кажется, что Вы говорите о.NET. Большинство систем (.NET и другие) имеет более подробные API, чтобы выяснить, существует ли файл при открытии файла.

То, что необходимо сделать, звонят для доступа к файлу, поскольку он будет обычно указывать через своего рода ошибку, что файл не существует (если он действительно не делает). В.NET необходимо было бы пройти уровень P/Invoke и использовать API-функцию CreateFile. Если та функция возвращает ошибку ERROR_FILE_NOT_FOUND, то Вы знаете, что файл не существует. Если это возвращается успешно, то у Вас есть дескриптор, который можно использовать.

Точка здесь - то, что это - несколько атомарная операция, которая в конечном счете является тем, что Вы ищете.

Затем с дескриптором можно передать его конструктору FileStream и выполнить работу над файлом.

0
ответ дан casperOne 27 November 2019 в 07:15
поделиться

Это зависит от Ваших требований, но один путь состоит в том, чтобы попытаться получить эксклюзивный открытый дескриптор файла со своего рода механизмом повторной попытки. После того как у Вас есть тот дескриптор, это будет твердым (или невозможный) для другого процесса для удаления (или перемещение) того файла.

Я использовал код в.NET, подобной следующему для получения эксклюзивного дескриптора файла, где я ожидаю, что некоторый другой процесс возможно запишет файл:

FileInfo fi = new FileInfo(fullFilePath);

int attempts = maxAttempts;
do
{
    try
    {
        // Asking to open for reading with exclusive access...
        fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.None);
    }
    // Ignore any errors... 
    catch {}

    if (fs != null)
    {
        break;
    }
    else
    {
        Thread.Sleep(100);
    }
}
while (--attempts > 0);
4
ответ дан Mitch Wheat 27 November 2019 в 07:15
поделиться

Для ответа на мой собственный вопрос (частично) я хочу подробно остановиться на примере, который я использовал: файл конфигурации по умолчанию.

Вместо того, чтобы проверять, существует ли это при запуске приложения и попытке скопировать файл, если проверка сбои, нужно всегда попытка скопировать файл. Вы просто делаете это таким способом, которым перестанет работать копия, если файл будет существовать, а не замените существующий файл. Таким образом, все, что необходимо сделать, поймать и проигнорировать любое исключение, выданное, если копия перестала работать из-за существующего файла.

0
ответ дан Joel Coehoorn 27 November 2019 в 07:15
поделиться

Ваша проблема может быть легко решена с помощью фундаментальной информатики ... прочтите на Semaphores .

(Я не хотел показаться придурком, я просто указывал вам на простой ответ для общей проблемы).

0
ответ дан 27 November 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: