2016-08-24 9 views
2

Мне было интересно, достаточно ли t создать библиотеку, которая будет выступать в качестве поставщика файлов в Windows.Можно определить пользовательскую схему URI, используемую в общесистемном режиме?

Например, если вы попытаетесь открыть файл ftp://example.com/touch.txt, используя стандартный диалог открытия файла, он (как-то волшебным образом) работает. Есть ли способ реализовать собственный провайдер для моей собственной схемы URI?

Может ли Asynchronous Pluggable Protocol быть решением? Я не смог найти пример рабочего кода о том, как заставить его работать.

Чтобы понять: мне нужно, чтобы это работало по всей системе. Это теперь связано с интернет-браузерами.

Что делать, если мне это нужно File.Open("my://test.txt")?

+0

Совершенно возможно, и вы на правильном пути. Взгляните на https://msdn.microsoft.com/en-us/library/aa767914%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 – itsme86

+0

Образец доступен здесь https: // blogs. msdn.microsoft.com/noahc/2006/10/19/register-a-custom-url-protocol-handler/ –

+0

ОК. Это позволяет мне открыть мое приложение, когда вызывается URI. Но что, если я хочу доставить объект через этот URI. например File.Read ("мой: //test.txt"); –

ответ

0

Ведение File.ReadAllBytes("ftp://example.com/touch.txt"); не работает, если вы попробуете это, вы получите исключение, как

System.NotSupportedException was unhandled 
    Message=The given path's format is not supported. 
    Source=mscorlib 
    StackTrace: 
     at System.Security.Util.StringExpressionSet.CanonicalizePath(String path, Boolean needFullPath) 
     at System.Security.Util.StringExpressionSet.CreateListFromExpressions(String[] str, Boolean needFullPath) 
     at System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList) 
     at System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, AccessControlActions control, String[] pathList, Boolean checkForDuplicates, Boolean needFullPath) 
     at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
     at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) 
     at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) 
     at System.IO.File.ReadAllBytes(String path) 
     at WindowsFormsApplication1.Form1.button1_Click(Object sender, EventArgs e) in D:\Code\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 25 
     at System.Windows.Forms.Control.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
     at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
     at System.Windows.Forms.Button.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at WindowsFormsApplication1.Program.Main() in D:\Code\WindowsFormsApplication1\WindowsFormsApplication1\Program.cs:line 17 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

Причины это работает, когда вы делаете OpenFileDialog это окно читы с этим и загрузит файл в локальные температуры сначала. Он делает это только для ftp: и http:, потому что OpenFileDialog обрабатывается оболочкой Windows, а оболочка использует схемы URI.

Я считаю, что ключ Source Filter под HKCR\ftp указывает на зарегистрированный COM-объект, который обрабатывает логику выполнения этой локальной копии.

Если вы просто хотите, чтобы ваше приложение было открыто, перейдя по URL-адресу, например steam, с помощью steam://rungameid/382110, вам просто нужно следовать инструкциям в this MSDN page.

Если вы хотите, чтобы ваш файл, который будет «открываемым» через оболочку, как http: или ftp: делает с диалогом открыть файл вам нужно будет написать COM объект, который действует как «Source Filter», я не знаю ни одного место для поиска документации по этому вопросу.

Обновление: Чтение больше похоже на Asynchronous Pluggable Protocol, как вы упомянули, как вы делаете эти фильтры источника. Я никогда не пытался сделать так, чтобы я не смог помочь вам в этом.