Swift4
Просто нашел решение для той же самой проблемы, Swift4. Идея в том, что: если нажатая клавиша обрабатывалась пользовательской логикой, обработчик должен возвращать nil, иначе (необработанное) событие ...
class MyViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
// ...
NSEvent.addLocalMonitorForEvents(matching: .keyDown) {
if self.myKeyDown(with: $0) {
return nil
} else {
return $0
}
}
}
func myKeyDown(with event: NSEvent) -> Bool {
// handle keyDown only if current window has focus, i.e. is keyWindow
guard let locWindow = self.view.window,
NSApplication.shared.keyWindow === locWindow else { return false }
switch Int( event.keyCode) {
case kVK_Escape:
// do what you want to do at "Escape"
return true
default:
return false
}
}
}
И вот мы: no Purr / Funk звук при нажатии клавиши ...
[Обновление] Добавлена проверка keyWindow. Без этого keyDown () запускается, даже если в другом представлении / окне содержится первый ответчик ...
Вы можете создать FileInfo для несуществующего файла. Но затем вы можете проверить свойство FileInfo.Exists, чтобы определить, существует ли файл, например:
FileInfo fi = new FileInfo(somePath);
bool exists = fi.Exists;
Обновление : в коротком тесте это также работало для путей UNC, например, например:
FileInfo fi = new FileInfo(@"\\server\share\file.txt");
bool exists = fi.Exists;
Вы уверены, что учетная запись (под которой запущено ваше приложение) имеет доступ к общему ресурсу. Я думаю, что (по умолчанию) административные права требуются для доступа к общему ресурсу "c $".
Это может или не может иметь место, но могли Вы присоединиться к Вашему пути имя файла неправильно для одного из Ваших случаев.
Это:
успех = Файл. Существует (путь + шаблон);
по сравнению с:
успех = Файл. Существует (Путь. Соединение (путь, шаблон));
Посмотрите этот вопрос:
, как можно легко проверить, запрещен ли доступ для файла в.NET?
короткая версия того вопроса - то, что Вы не делаете, потому что файловая система энергозависима. Просто попытайтесь открыть файл и поймать исключение, если это перестало работать.
причина Ваш isFileFound
, метод не работает, состоит в том, потому что FileInfo
структура, которую Вы используете, может также использоваться для создания файлов. Можно создать объект FileInfo с желаемой информацией для несуществующего файла, звонить, это .Create()
метод, и Вы установили свои желаемые свойства внезапно.
я подозреваю причину, которую приводит к сбою путь UNC, или 1) проблема полномочий, получающая доступ к администраторской доле от пользователя, запускающего Ваше приложение, или 2) $
, символ отбрасывает метод, или потому что это не вводится правильно или из-за ошибки в базовом.Exists () реализация.
Обновление:
, Когда я отправляю это предложение, я почти всегда получаю жалобу на выполнение исключения. Давайте говорить об этом. Да, обрабатывание исключений является дорогим: очень дорогой. Существует немного вещей, которые можно сделать в программировании, которые медленнее. Но Вы знаете, какой те немного вещей? Диск и сеть I/O. Вот ссылка, которая демонстрирует, какого количества стоили дисковый ввод-вывод и сеть I/O:
Latency Comparison Numbers -------------------------- L1 cache reference 0.5 ns Branch mispredict 5 ns L2 cache reference 7 ns 14x L1 cache Mutex lock/unlock 25 ns Main memory reference 100 ns 20x L2 cache, 200x L1 cache Compress 1K bytes with Zippy 3,000 ns Send 1K bytes over 1 Gbps network 10,000 ns 0.01 ms Read 4K randomly from SSD* 150,000 ns 0.15 ms Read 1 MB sequentially from memory 250,000 ns 0.25 ms Round trip within same datacenter 500,000 ns 0.5 ms Read 1 MB sequentially from SSD* 1,000,000 ns 1 ms 4X memory Disk seek 10,000,000 ns 10 ms 20x datacenter roundtrip Read 1 MB sequentially from disk 20,000,000 ns 20 ms 80x memory, 20X SSD Send packet CA->Netherlands->CA 150,000,000 ns 150 ms
, Если взгляды в наносекундах не являются Вашей вещью, вот является другой ссылкой, которая нормализует один цикл ЦП как 1 секунду и масштабируется оттуда:
http://blog.codinghorror.com/the-infinite-space-between-words/
1 CPU cycle 0.3 ns 1 s Level 1 cache access 0.9 ns 3 s Level 2 cache access 2.8 ns 9 s Level 3 cache access 12.9 ns 43 s Main memory access 120 ns 6 min Solid-state disk I/O 50-150 μs 2-6 days Rotational disk I/O 1-10 ms 1-12 months Internet: SF to NYC 40 ms 4 years Internet: SF to UK 81 ms 8 years Internet: SF to AUS 183 ms 19 years OS virt. reboot 4 s 423 years SCSI command time-out 30 s 3000 years Hardware virt. reboot 40 s 4000 years Physical system reboot 5 m 32 millenia
Взятие даже лучший вариант развития событий для исключений, можно получить доступ к памяти по крайней мере 480 раз при ожидании на первом ответе от диска, и это принимает очень быстрый SSD. Многим из нас все еще нужны вращающиеся жесткие диски, где вещи становятся очень, намного хуже.
И это - только начало истории. Когда Вы используете .Exists()
, Вы подвергаетесь этому дополнительный стоимость (и это - дополнение: необходимо сделать ту же работу снова, когда Вы идете для открытия файла) на [1 116] каждый попытка. Вы платите, это стоит, существует ли файл или нет, потому что диск все еще должен искать его в, он - таблицы файлов. С методом исключения Вы только оплачиваете дополнительные расходы раскручивания стека вызовов в случае отказа.
, Другими словами, да: исключения являются ужасно дорогостоящими. Но по сравнению с дисковой проверкой, это еще быстрее: а не просто маленьким полем. К счастью это вряд ли определит общую эффективность Вашего приложения..., но я все еще хочу отправить "исключения спать, медленный" аргумент в пользу этой определенной задачи.
Это может помочь Вам:
http://www.codeplex.com/FileDirectoryPath
Это NDepend. Помощники. FilePathDirectory, которые имеют "API проверки достоверности пути" среди другого, который может быть полезным.
Итак, я выбрал опцию
bool success = File.Exists(path + Filename);
, а не по маршруту FileInfo.
Спасибо за все предложения!