执行具有长文件路径的文件

时间:2012-02-13 12:14:59

标签: c# execute process.start long-filenames

我正在尝试编写一个程序来传递一个文件名字符串。 然后我希望程序启动/打开我作为参数传递的文件。

我做了一些研究,我很确定我必须使用这样的东西: Link

但我只找到了打开文件(删除文件,删除文件和查找文件)的示例。MS Library

我在调整代码方面遇到了麻烦。

任何人都可以帮助我吗? 这就是我想出的:

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.ComponentModel;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern bool abreFicheiro(string lpFileName, bool bFailIfExists);

        static void Main(string[] args) {
            string caminho = fixPathForLong(@args[0]);
            abreFicheiro(caminho);
        }

        public static bool abreFicheiro(string caminho) {
            Process.Start(caminho);
            if (!abreFicheiro(caminho, false))
            {
                throw new Win32Exception();
            }

            return true;
        }

        private static string fixPathForLong(String path)
        {
            if (!path.StartsWith(@"\\?\"))
                path = @"\\?\" + path;
            return path;
        }
    }
}

修改 对于我不想要的东西似乎有些混乱,所以我会试着澄清一下。

我有一个FoxPro应用程序,其中存储了记录。对于其中一些记录,我想关联图像或文档,因此我将其路径存储到数据库中的字段中。 到现在为止还挺好。 问题是文件上升到几TB(这是正确的Tera字节),并且路径长于Windows API允许的最大值。

我想直接从Fox打开这些文件,但Fox不支持长路径。 所以我想在C#中编写一个应用程序,我将长文件名作为参数传递,然后由该应用程序打开...

问题是C#还“继承”了Windows API的限制。 我遇到了删除,移动和打开(在编辑模式下)具有这样的长路径的文件的解决方法。但我想要的只是让Windows打开文件并将其显示给用户。

希望我清楚自己。 抱歉英文不好。

2 个答案:

答案 0 :(得分:0)

我认为这可以使用FileStream类。或者我可能会误解你的问题吗?

答案 1 :(得分:0)

事实证明我的代码几乎正确:

这是正确的代码:(如果有人想知道的话)

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.ComponentModel;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

namespace ConsoleApplication1
{
    class Program {
        static void Main(string[] args)
        {
            string caminho = fixPathForLong(@args[0]);
            Process.Start(caminho);
        }

        private static string fixPathForLong(String path) {
            if (!path.StartsWith(@"\\?\"))
                path = @"\\?\" + path;
            return path;
        }
    }
}