- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发 Cocoa/Objective C++ 实用程序应用程序,并且想要处理多个(瞬时)文件打开。为了处理文件打开部分,我在 AppDelegate.mm
文件中有这个函数:
- (BOOL)application:(NSApplication*)app openFile:(NSString *)filename
{
NSLog(@"Opening file %@", filename);
// more C++ code here
return YES;
}
这些文件正在发送到 Quicksilver,我相信 Quicksilver 会将文件一个接一个地发送到应用程序(我认为 Finder 的“打开方式”会一次发送所有文件 - 因此可能使用 handleOpenApplicationEvent:(NSAppleEventDescriptor *)event
可能更适合这一点) - 但无论如何,应用程序将一个接一个地接收多个文件 - 几乎是瞬时的 - 但不完全一起。以下是 Console.app 显示的内容:
console-screenshot.png http://img109.imageshack.us/img109/1205/consolescreenshot.png
由于文件是单独发送的,但是一个接一个地发送,我的问题是如何收集所有发送的文件并用它们做一件事?例如,我想收集发送的所有文件路径,然后将它们一起显示在对话框中。
我可以想到一个可能有效的概念:在接收到每个文件路径时将其存储在数组中。同时,当收到第一个时,在后台设置 1-2 秒的延迟,然后有一个对话框显示特定变量的所有内容。这个概念正确吗?或者有更好的方法吗?我是 Cocoa/Objective C++ 的新手 - 来自 PHP/Perl、bash 等语言。
我还想让这个辅助应用程序在完成后终止,但如果我正在等待文件,如何在收到最后一个文件时终止该应用程序?
如果我将 [NSApp Terminate:nil];
添加到 applicationDidFinishLaunching
函数,则应用程序实际上会在仅收到第一个文件后终止。
更新 - 更多注释
这是使用openFiles
(复数)函数后的控制台: Picture 7.png http://img24.imageshack.us/img24/5715/picture7zc.png
使用 Quicksilver,我抓取一些文件,例如临时目录中的文件,然后选择“打开方式”,然后选择我正在创建的应用程序(名为 darn.app)
但使用 Finder 似乎效果很好:
...consolea.app 中的结果:
Picture 8.png http://img24.imageshack.us/img24/2812/picture8fe.png
我确实询问了 Quicksilver 开发人员,他们确认 QS 确实通过“打开方式”操作一次打开一个文件,并且他们承认这与 Finder 的做法不同,但他们认为这是预期的。所以也许达伦是对的 - 计时器可能是最好的方法......
最佳答案
尝试实现 -application:openFiles:
而不是 -application:openFile:
- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
{
NSLog(@"Opening multiple files %@", filenames);
}
它处理从 Finder 接收多个文件。
如果这不适用于您的 Quicksilver 设置,那么计时器可能是最好的方法。
在 AppDelegate 的 -init 方法中设置计时器。
@implementation MyAppDelegate {
NSMutableArray* _files;
}
- (id)init {
if (self = [super init]) {
_files = [[NSMutableArray alloc] initWithCapacity:10];
[self performSelector:@selector(processFiles)
withObject:nil
afterDelay:1.0]; // one second delay
}
return self;
}
在-application:openFile中:将文件收集到数组中并重置计时器。
- (BOOL)application:(NSApplication*)app openFile:(NSString*)filename {
NSAssert(_files != nil, @"Timer already fired");
[_files addObject:filename];
[NSObject cancelPreviousPerformRequestsWithTarget:self];
[self performSelector:@selector(processFiles)
withObject:nil
afterDelay:1.0];
}
当计时器启动时,处理收集的文件,然后退出应用程序。
-(void)processFiles
// Process the _files
[_files release];
_files = nil;
[NSApp terminate:nil];
}
关于macos - 如何收集多个openFile :(NSString *) events and then do something with them?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8917874/
我想打开一个文件,将其拖放到应用程序图标上。当我这样做时,我的应用程序被打开,因此文件扩展名定义明确并且与我的应用程序相关。但是 application:openFile: 函数永远不会被调用。所以我
我正在尝试“即时”格式化openfiles.exe的输出,而不是将输出保存到CSV并导入。 如果我只运行openfiles /query /s SERVERNAME /fo table,我会得到 ID
我正在尝试编写一个程序来读取文件,同时允许其他应用程序访问它。我了解到,在 Windows 中,您需要传递 syscall.FILESHARE_READ/WRITE 标志以防止文件锁定。但是,引入这些
当我尝试向文件写入内容时出现“openFile - permission denied”错误: saveFile content path = do writeFile path (s
我一直在尝试在运行的 Eclipse session 中从命令行打开文件。基于documentation ,我应该可以做到 eclipse --launcher.openFile myfilename
当给定由\n 分隔的文本输入文件时,该程序会产生我期望的输出: import System.IO main :: IO () main = do h IO [String] getlines h =
我正在尝试创建一个aspx页面,在该页面中我可以直接将文件从客户端上传到服务器,而无需用户干预。我想做一些事情,比如当用户在 url 中指定文件路径时,必须将该特定文件上传到服务器。 示例:ht.tp
void openfile(FILE *fichier,char *str){ char path; path=(char*)malloc(sizeof(char)); fic
我一直在关注有关 allegro 5 平台游戏的教程,他的文件管理器使用 !openFile.eof(),我听说它不太好,我很确定它是什么给我一个 vector 下标超出范围错误。除了它还有什么我可以
Vista 引入了一个接口(interface):IFileDialog::SetFilter,它允许我设置一个过滤器,该过滤器将为每个可能的文件名调用以查看它是否应该显示给用户。 Microsoft
我正在尝试为 db4o 创建一个通用的助手类。 我创建了一个静态类,它应该在每个应用程序页面中充当助手。 这是我的代码: public final class DatabaseHelper imple
我目前遇到了 os.OpenFile 的问题。当我运行我的 go 测试时,它只是给我“权限被拒绝”。 type log struct { Message string Source
像这样使用时 [ [NSWorkspace sharedWorkspace] openFile:fileName withApplication:appName]; 并且文件名包含空格 另一个应用程序
我正在使用 kube-aws 在 AWS 上创建 kubernetes 集群,我有 kube-aws 版本 v0.12.3,当我尝试时,工作节点上经常出现“系统中打开的文件太多”的问题ssh 进入工作
大多数gif捕捉软件都是捕捉屏幕,然后将其一帧一帧的图片文件保存在磁盘上,然后读入内存并组合成gif,整个过程非常缓慢。 我想到了用DirectX捕获屏幕(这样我们也可以更快地捕获directx窗口,
我已经在 the msdn doc 中查看了这段代码: Stream myStream = null; OpenFileDialog openFileDialog1 = new OpenFileDia
我正在尝试编写一个应用程序,它可以处理 ftp 服务器上的文件。我需要在一个 ftp 连接中打开多个文件。我这样做 CInternetSession session(_T("Session1"));
当我以这样的模式打开文件时: file, _ := os.OpenFile("/path/to/my/file", os.O_RDWR|os.O_APPEND, os.FileMode(0666))
我想通过以下功能打开并引用工作簿。只有函数会产生运行时错误“91”:在跳回主代码之前未设置对象变量或 block 变量。 当我将确切的代码(只是不是函数)放入我的主代码时,它可以完美地工作。 但是我不
我已经在一个网站上工作了大约一个月,最近我尝试烘焙一些东西,现在我真的被刚刚弹出的缓存权限问题困住了。例如,我已经阅读了有关此问题的 stackoverflow 上的所有内容: SplFileInfo
我是一名优秀的程序员,十分优秀!