症状重放:

症状重放:

在学堂实验和培养和磨练的这几天,老师带着我们开头深远的复习java。那是首先天的情节哦

MAX_PATH的演说:
文件名最长256(ANSI),加上盘符(X:\)3字节,259字节,再加上得了符1字节,共260

近年来安装3个Delphi的控件,结果,在装置之后运转Delphi时出现了找不到相关文件的不当。一初始觉得是Delphi内的Library路径没有添加,查看,一切寻常。再度运维Delphi,提示说将xxx路径插入到PATH环境变量中战败,原因是PATH变量超出长度限制。

近日安装多个Delphi的控件,结果,在安装之后运维Delphi时出现了找不到有关文书的错误。一伊始觉得是Delphi内的Library路径没有添加,查看,一切平常。再度启航Delphi,提醒说将xxx路径插入到PATH环境变量中败诉,原因是PATH变量超出长度限制。

对于“JAVA设置环境变量和在DOS下运作java程序”,许多初学者是素不相识的,但打听那几个却对前期的学习很重要。

windows下,全文件名的字符长度是有限定的,人人皆知,是MAX_PATH,260。对于那几个,几点现实表达:

搜寻根源:

查找根源:

  1. 以此260指的是含有目录到文件名的方方面面径字符长度。
  2. 实质上,测试能够窥见:
    –加上null,你在财富管理器里只好创制25玖个字符的全文件名,即事实上只好创设MAX_PATH
    -2 = 258字符的门道。
    –你能够创设c:\长目录\abc.txt <=
    258,也得以创造c:\abc\长文件名.txt <= 258。
    –创制每超级目录的时候,可以输入的目录名字符是有限定的,规则正是:至长史留下了
    1一个字符(8.3规则?)使得最内层目录还是能够创建出文件。
    –然而,比如你创建了C:\abc\长文件名.txt,然后呢,重命名目录abc,那时候,你能够成立出二个总厅长度超越MAX_PATH的全文件名。非凡tricky。

根据Delphi的提醒,打开环境变量设置窗口,发现PATH变量确实非常长(安装了诸多开发工具,很多都亟待设置环境变量),由于那些控件存在独立运作环境,供给写入系统PATH环境变量。但不巧那些控件的名字又长的可怜。先前有同学告诉自个儿,PATH太长能够选择小名来缓解,即开立其余名称的环境变量,并在PATH中使用三个“%”来引用,于是将有些PATH路径拿出去,新建了3个环境变量并在PATH中引用。

基于Delphi的唤醒,打开环境变量设置窗口,发现PATH变量确实十分长(安装了好多开发工具,很多都必要设置环境变量),由于那多少个控件存在独立运作环境,需求写入系统PATH环境变量。但不巧那几个控件的名字又长的相当。先前有同学告诉本身,PATH太长能够应用小名来缓解,即开立别的名称的环境变量,并在PATH中利用两个“%”来引用,于是将一些PATH路径拿出去,新建了1个环境变量并在PATH中引用。

上面先来打探一下如何是dos吧

参考:

再起步Delphi,咦?另二个文书又找不到了。反复检讨发现,刚刚确立的环境变量已经起效果,但别的的路径又不见了。于是打开CMD控制台,输入PATH,才意识,PATH变量的值已经被截断,原来老大使用别称的方法只是治标不治本。单条PATH变量能够插入了,变量值的尺寸限制依然存在。难道,非要笔者把各类程序都设置到短文件路径中?

再开发银行Delphi,咦?另3个文本又找不到了。反复检查发现,刚刚建立的环境变量已经起效能,但其它的路径又不见了。于是打开CMD控制台,输入PATH,才发现,PATH变量的值已经被截断,原来那一个使用外号的法门只是治标不治本。单条PATH变量能够插入了,变量值的长短限制依旧存在。难道,非要笔者把种种程序都安装到短文件路径中?

dos

     
大家使用电脑接触最频仍的便是DOS。DOS是英文Disk Operating
System的缩写,意思是“磁盘操作系统”,顾名思义,DOS首即便一种面向磁盘的系统软件,说得简单些,DOS正是人给机器下达命令的汇集,是储存在
机器硬件里头的有些命令集,有了DOS,大家就能够更便于掌握怎么给机器下命令,不必去长远摸底机器的硬件结构,也不要去死记硬背那一个枯燥2进制数字的机
器命令,只需经过一些好像于乌克兰(Ukraine)语的DOS命令,大家就足以轻松地做到绝抢先二分一的普通操作。其余,DOS还能够使得地保管在它决定下的各样软硬件资源,对它们
进行客观的调度,全数的软件和硬件都在DOS的监察和控制和管理之下,有条有理地展开着运维。

环境变量PATH超长难题,JAVA设置环境变量和在DOS下运转java程序。—————————— 化解方案一

那您不要用它的全路径来创建,用某些文件夹的DirectoryInfo来创设不就好了
多谢提醒,取得父文件夹路径CreateSubdirectory就足以了。试了好多办法,怎么把那么些忘了,汗一下本人。

让大家从BCL中的三个有意思的要命开端明日的话题:[PathTooLongException]:
The specified path, file name, or both are too long. The fully qualified
file name must be less than 260 characters, and the directory name must
be less than 248 characters.我们的客户在bug报告里说:
“路径最四唯有2伍15个字符? MS搞笑的吧. 把这几个范围搞得更长一些!”.
在那里自个儿将会对那个付出bug报告的人(很对不起你们的bug被关成了”won’t
fix”)详细分解这些标题并告知你们大家对此所作出的努力.让我们先来正本清源一些术语:Path:
一个文件的百分之百径. 比如您又2个文书: c:\temp\fileA.txt,
那么一般你会叫这一个文件fileA.txt,
但它的全路径应该是c:\temp\fileA.txt.
MAX_PATH: Windows API定义的不二法门的最大尺寸, 2伍拾4个字符.
Long path: 贰个长度超过了MAX_PATH的路径.
Long file name: 跟long path还分化. 这么些实际是用来跟短文件名作相比的,
正是在此之前笔者们说的十分8.3格式的公文名.
远近著名.NET API是凭借于Windows API的, 从那点上看,
上面包车型客车这些充裕就从未有过什么样难题了. 但是Windows
API还提供了1个格局来绕过那么些MAX_PATH的限制.
就算您在您的文书路径前边加上”\\?\”的前缀,
然后调用unicode版本的Windows API, 那么你的path的最大尺寸就能够高达32k了.
也正是说您只要添加前缀”\\?\”就足以在Windows API中行使long
path了.没有人会抱怨32k的尺寸限制了, 那么是或不是就能够说难题化解了啊?
也不完全是. 过去大家不愿意辅助long path是有缘由的,
而且以往大家还会设想那一个原因. 第四个原因便是安全.
前缀”\\?\”并不只是打破的long path的界定,
它还能够让path在到达文件系统从前只受到Windows API的细小的校订.
这样做的结果正是”\\?\”规避了Windows
API对于path的一多样的规范的操作: 去掉path前面包车型大巴空格,
把’.’和’..’扩大为对应的内容, 以及把相对路径转换来全路线等等.
在.Net中的若是用FileIOPermission attribute来担保卫安全全,
大家就只可以动用规范后的路径. 而不用FileIOPermission就会有平安隐患.
未来大家清楚了一旦大家用前缀”\\?\”来化解long path的题材来说,
大家就必须能像Windows API这样把路子标准化.第二个原因是永葆long
path或者造成的不平等行为. 很多操作文件的Windows API都援助以”\\?\”
作为前缀的long path, 但仅仅是多多益善而不是一体. 比如LoadLibrary,
它的效益是将1个module映射到调用者的地址空间,
在文书路径超越MAX_PATH的时候就会失利.
那就象征你能够调用MoveFile把三个DLL放到1个路径长度当先MAX_PATH的地点,
不过当你想加载这么些DLL的时候却难倒了. 在Windows API里面有广大如此的例证,
纵然有局地权宜之计, 但都是对准特殊题材的,
没有三个通用的消除方案.其它贰个成分, 也是最痛心的多少个, 是Windows
Application和Windows shell自身在long path上的合营性. 因为Windows
shell自身只帮助长度小于260的路径 (上边会讲到Vista shell弱化了这么些界定).
正是说如若.NET援救了long path, 那么你就足以经过你的.NET
App创造一些在Explorer或是命令行中不能够访问的文本了.
J我们早就意识到了2陆十一个字符的限制并不是很合理.
大家的客户并不常常蒙受那个难题, 可是若是供给一个超乎MAX_PATH的不二法门,
就会认为很不方便. 1个权宜之计是P/Invoking Windows
API并应用”\\?\”前缀, 不过如此就只可以写一大坨跟System.IO重复的code.
所以为了消除那一个标题, 我们的客户常常会重新规划目录结构,
大费周折的抽水目录名. 因为那个标题早就日渐变得广大, 所以无论是.NET
framework如故其余领域, MS都早就上马初始消除那么些题材.
实际上在vista中您应当早就得以见到大家为了减小出现MAX_PATH的题材的概率所作出的变动:
很多一定的目录名已经被裁减 (译注: \Documents and Settings à \Users,
实际上, 在MS有一个专门的alias叫longpath来谈谈那几个标题),
shell还有1个auto-path shrinking的功效,
它会用比较短的小名来代表路径以把那一个long path压缩在2五十八个字符以内.

单方治疗:

单方治疗:

常用命令编辑(在java运维里用到的)

1 dir

无参数:查看当前所在目录的文书和文书夹。

2 cd

cd
目录名:进入特定的目录。

cd\
退回到根目录。

cd..退回到上一级目录。

3 md rd

md
目录名:建立一定的文本夹。 (dos上面习惯叫目录,win上面习惯叫文

件夹。)

rd
目录名:删除特定的文本夹。

4 del

del
文件名:删除3个文书。

del
*.*:删除当前文件夹下全体文件。

del不能够去除文件夹。

5 Set

呈现、设置或删除环境变量。假诺没有任何参数,set
命令将显妥当前条件设置。

6 exit

退出cmd.exe程序或方今

7 Ipconfig

来得全体当前的 TCP/IP
网络计划值、刷新动态主机配置协议 (DHCP) 和域名系统 (DNS)
设置。使用不带参数的 ipconfig 能够来得全数适配器的 IP
地址、子网掩码、暗中同意网关。

那么在dos环境下怎么着运行java呢

率先要学会配置java运维环境

 

开拓环境变量对话框

1.率先在自己的电脑点击右键,选取属性选项;

2.然后点击高级系统装置,然后弹出系统属性框,在高级选项卡中我们得以看看环境变量按钮;

3.点击环境变量后弹出对话框,一般大家设置的是path只怕classpath

 

假设JDK安装于D:\java\jdk1.5.0_08

开班计划:

1.新建(如有就不要了)JAVA_HOME,变量值为 D:\java\jdk1.5.0_08

2.PATH 变量值为
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin 

3.CLASSPATH
变量值为 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
(要加.表示如今路线)

 

接下去测试下是或不是成功铺排:

在dos下输入“java
-version”,“java”,“javac”多少个指令,现身画面,表明环境变量配置成功;

 

接下去编写翻译程序

“开始”->;“运行”,键入“cmd”;

第②编好三个.java的公文

下边开端你的首先个java程序吗

澳门金沙国际 1

javac
文件名.java——为了生成.class文件(javac是编写翻译java代码)

java
文件名(那步不要后缀名)(java是运作java程序)

 

不过在有个别优秀的事态下大家可能会动用一时的环境变量配置。比方说大家借用外人的处理器时,却不能够改变别人的总结机设置,那时你会怎么做?作者想最好的章程就是二个移动U盘加权且环境变量配置。

临时环境变量配置能够利用DOS命令,在cmd命令行中输入set,你会看出您的微处理器中全体的环境变量,而通过输入set 
path可展现出path的有着变量 而设置临时的path环境变量则只需输入: 
  set  path=F:/Demo/java即可,它对电脑连串中的配置没有影响。
  

另有输入:
  set
path=F:/Demo/java;%path%

  那表示在原来的设置上添加二个门道,对电脑体系中的配置没有影响。

  总计一下便是:

  set
用于查看本机的具有环境变量;
  set
变量名:查看二个切实可行的环境变量;
  set
变量名=:清空三个环境变量;
  set 
变量名=具体值:给钦定变量定义具体指;
  set
变量名=具体值;%path%:在原有环境变量基础上添加新值。

  注意:那种布局情势只在时下dos窗口有效,窗口关闭后则配备消失。

  同理可得,classpath环境变量的一时半刻布署也是千篇一律

注:

    Path

Path使得系统能够在其它路径下识别java命令,设为:

%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

 CLASSPATH为java加载类(class
or lib)路径,唯有类在classpath中,java命令才能鉴定识别,设为:

澳门金沙国际 ,.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
(要加.表示近期路线)

%JAVA_HOME%正是引用前边内定的JAVA_HOME;

 

    javac

javac
是java语言编制程序编写翻译器。javac工具读由java语言编写的类和接口的定义,并将它们编写翻译成字节代码的class文件。javac
能够隐式编写翻译一些没有在命令行中提及的源文件。

   

   
jdk和jre的区别
(收藏的博客,借鉴一下)
(收藏的博客,借鉴一下)
JRE(Java Runtime
Enviroment)是Java的运营环境。面向Java程序的使用者,而不是开发者。借使你仅下载并安装了JRE,那么您的种类只好运转Java程序。JRE是运维Java程序所必须环境的集纳,包罗JVM标准落到实处及Java大旨类库。它包蕴Java虚拟机、Java平台主旨类和辅助文件。它不分包开发工具(编写翻译器、调节和测试器等)。

JDK(Java Development
Kit)又称J2SDK(Java2 Software Development
Kit),是Java开发工具包,它提供了Java的开销条件(提供了编写翻译器javac等工具,用于将java文件编写翻译为class文件)和平运动行条件(提供了JVM和Runtime援助包,用于解析class文件使其得到周转)。尽管您下载并设置了JDK,那么您不光能够支付Java程序,也同时具备了运维Java程序的阳台。JDK是漫天Java的宗旨,包涵了Java运维条件(JRE),一堆Java工具tools.jar和Java标准类库(rt.jar)。
总:JRE首要包罗:java类库的class文件(都在lib目录下打包成了jar)和虚拟机(jvm.dll);JDK首要涵盖:java类库的class文件(都在lib目录下打包成了jar)并自带3个JRE。

  
简述JAVA_HOME,path和classpath环境变量的效用

(收藏的博客,借鉴一下)
1.
PATH环境变量。效率是指定命令搜索路径,在i命令行上面执行命令如javac编写翻译java程序时,它会到PATH变量所钦命的路线中搜寻看是还是不是能找到呼应的吩咐程序。大家要求把jdk安装目录下的bin目录扩充到存活的PATH变量中,bin目录中包括日常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就能够在其余目录下实施javac/java等工具了。
2.
CLASSPATH环境变量。功效是钦命类搜索路径,要接纳已经编写制定好的类,前提当然是可以找到它们了,JVM正是通过CLASSPTH来寻觅类的。我们须要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也不能不加入到该变量中。
新版的软件,classpath好像都尚未怎么用了,因为在安装的时候曾经选了JDK而且能够加上

3.
JAVA_HOME环境变量。它指向jdk的装置目录,Eclipse/NetBeans/Tomcat等软件便是通过搜索JAVA_HOME变量来找到并行使安装好的jdk。

 

 

 

—————————— 消除方案二

上层逻辑控制和事务处理使用 Java 开发,而底层宗旨功用使用 C/C++
实现,那早就改成一种较为通用的开支方式。但出于 Windows
操作系统的私下认可设置,上述语言在对长路径名(>260
字符)文件的处理时会碰到有的难题。本文列出了分歧的 JDK 版本在 Windows
操作系统上对此长路径名文件处理的不一样,给出了三种扶助长路径名文件的 C/C++
编制程序方法,同时还提出了从 JDK 5.0
初步才完全扶助长路径名。使用本文的方法,能够化解在 Windows 平台上规范
API 函数对长路径名文件扶助的局限性难题,给开发测试工作带来方便。

当本人无法中想到重装程序到短文件路径时,突然拉亮了另一盏灯。对,DOS8.3格式的短文件名!(哈哈,当时自作者叫出来的率先句就是,你太有才了…)。所谓DOS8.3格式短文件名便是文本或目录名分8字节主文件名和3个点加3字节的扩大名,在非DOS时代的体系,就算文件名能够高于那些界定,但依然可以行使该规则来操作文件名,即采纳大家平时看看的“~n”方式。

当本身无奈中想到重装程序到短文件路径时,突然拉亮了另一盏灯。对,DOS8.3格式的短文件名!(哈哈,当时本身叫出来的第二句就是,你太有才了…)。所谓DOS8.3格式短文件名正是文件或目录名分8字节主文件名和1个点加3字节的壮大名,在非DOS时期的系统,即使文件名能够超越这些限制,但依然能够使用该规则来操作文件名,即选取大家平日来看的“~n”方式。

Windows 对长路径名文件的限定

备受瞩目,微软的文件系统经历了 fat->fat32->NTFS
的技能变革。且不论安全和文件协会方式上的改革机制,单就文件名而言,已经从古老的
DOS 8.3 文件格式(仅支持最长 8 个字符的文件名和 贰个字符的后缀名)转变为能够支持长达 2伍十七个字符的文本名。而对此路径长度,NTFS 也曾经补助长达 327七1捌个字符的路径名。

但是,Windows 操作系统并不曾完全放手路径名长度的界定,在 windef.h
中,能够找到如下的宏:

#define MAX_PATH 260

实际,全体的 Windows API
都遵循那些范围。因而,每当我们总括改变某一文本的文书名时,当输入的文本名长度
( 全路径 ) 到达一定限度时,尽管文件名本人还未达到规定的标准 251个字符的限量,可是任何输入将不再被接受,那实际上便是由于操作系统分化意 25玖个字符(byte)的公文全路线。

骨子里运用中,那种 2陆拾二个字符的全路径的限量给接纳开发拉动了一点都不小的困顿。试想如下应用:大家盼望给应用服务器增添1个地点cache
的作用,该作用能够把远程服务器上的公文留下三个本地的副本。多个靠边的达成能够把
url 映射为文件名,当 url 十分长时,cache
文件的长短也会非常短。当文件名长度抢先 255,我们得以把映射文件名的前 2伍拾六个字符作为目录名称。但是,我们依然鞭长莫及化解 2六二十个字符的全路径限制。此外,借使3个选拔软件的目录结构过深,很简单并发某个文件名长度(含路径)超过2六十四个字符,并就此造成安装或删除的退步。一句话来说,该限制给我们的付出测试工作带来了难堪。

对于部分网络服务器,往往须求将 Java 代码用于上层逻辑控制 /
事务处理的支出,同时将 C/C++
用于底层大旨职能的贯彻。为此,大家研究了那三种程序语言对长路径名文件的支持情形。个中,对于
Java,相比较了三个常用版本 1.4 和 5.0 对长路径帮衬的差别性;对于 C/C++
语言的局限性,提出了我们的化解方法。

试行环境

 

操作系统: Windows xp

文件系统: NTFS 文件系统

Java 编写翻译环境:JDK 1.4.2 以及 JDK 5.0

C++ 编写翻译环境: VC.net

那么,既然很多文本夹名称都那么的长(比如MS SQLSE奥迪Q3VE奥迪Q5的Microsoft SQL
Server文件夹),那使用DOS8.3格式的短文件名来压缩路径,不就能够起到裁减PATH路径的效能了?

那么,既然很多文件夹名称都那么的长(比如MS SQLSE帕杰罗VE索罗德的Microsoft SQL
Server文件夹),那使用DOS8.3格式的短文件名来压缩路径,不就能够起到裁减PATH路径的功能了?

在 Java 中利用长路径名文件

Java
语言并不要求对长路径名文件进行尤其的处理,就足以协理长路径名文件的创导、读写和删除操作等基本操作。不过,JDK
1.4.2 和 JDK 5.0 在长路径的帮助上是见仁见智的,JDK 1.4.2
并不是一心帮助具备的长路径名文件操作,比如访问文件属性的操作是不援救的。大家设计了之类代码来申明JDK 1.4.2 和 JDK 5.0 对长路径名文件协理的区别。

清单 1. 对长路径名文件操作的 Java 实验代码:

try {
    String fileName = "E:\\VerylongpathVerylongpathVerylongpath
        VerylongpathVerylongpathVerylongpathVerylongpath
        VerylongpathVerylongpathVerylongpathVerylongpath\\
    VerylongpathVerylongpathVerylongpathVery
        longpathVerylongpathVerylongpathVerylongpath
    VerylongpathVerylongpathVerylongpathVerylongpa
        th.txt";
    System.out.println("Filename: " + fileName);
    System.out.println("File path length: " + fileName.length());
    String renameFileName = "E:\\VerylongpathVerylongpathVerylongpath
        VerylongpathVerylongpathVerylongpathVerylongpath
        VerylongpathVerylongpathVerylongpathVerylongpath\\Short.txt";

    //Create the file.
    File file = new File(fileName);
    if (!file.exists())
        file.createNewFile();
    if (file.exists())
        System.out.println("The file exists!");
    if (file.canRead())
        System.out.println("The file can be read!");
    if (file.canWrite())
        System.out.println("The file can be written!");
    if (file.isFile())
        System.out.println("It's a file!");

    //Write to the created file.
    FileOutputStream out = new FileOutputStream(file);
    PrintStream p = new PrintStream(out);
    p.println("This is only a test!");
    p.close();

    //Read the information from that file.
    BufferedReader br = new BufferedReader(new FileReader(file));
    StringBuffer sb = new StringBuffer();
    while (true) {
        String sl = br.readLine();
        if (sl == null) {
            break;
        } else {
            sb.append(sl + "\n");
        }
    }
    br.close();
    System.out.println("The content in the file:");
    System.out.print("\t" + sb.toString());

    //File rename
    File newfile = new File(renameFileName);
    if (newfile.exists())
        System.out.println(renameFileName + "exsited");
    else {
        if (file.renameTo(newfile)){
            System.out.println("Rename sucessful!");
        } else {
            System.out.println("Rename failed!");
        }   
    }

    //delete file
    if (file.delete())
        System.out.println("The old file deleted!");
    if (newfile.delete())
        System.out.println("The renamed file deleted!");
    }  catch (IOException e) {
        //Error happened
        e.printStackTrace();
        System.out.println("Error occurs in writing to the file.");
    }
}

清单 2. 使用jdk1.42 的结果

Filename: E:\VerylongpathVerylongpathVerylongpath
VerylongpathVerylongpathVerylongpathVerylongpathVer
ylongpathVerylongpathVerylongpathVerylongpath\
VerylongpathVerylongpathVerylongpathVerylong
pathVerylongpathVerylongpathVerylongpath
VerylongpathVerylongpathVerylongpathVerylongpath.t
xt


File path length: 272


The content in the file:


This is only a test!


Rename failed!

The old file deleted!

从尝试结果来看,JDK 1.4.2
获得了该长路径名文件的内容,因而,对于该长路径名文件的创办以及读写操作都以支撑的。然则相比较下文使用
JDK 5.0
的结果,能够看看,全部对于文件属性的判断都是不对的,同时,重命名的操作也无能为力落实。更为重要的是,JDK
1.4.2 存在着二个很致命的题材,即方法 File.exists()
是失效的。平时,在剔除文件前,要求调用该方法判断文件是还是不是存在,对于 JDK
1.4.2,假设直接去删除2个不明白是或不是存在的文本,就会存在比较大的高危机。因而,JDK
1.4.2 在 Windows
平台对长路径名文件的操作只是少数的协助,使用的时候,一定要留意。

清单 3. 使用jdk5.0 的结果

Filename: E:\VerylongpathVerylongpathVerylongpath
VerylongpathVerylongpathVerylongpathVerylongpathVer
ylongpathVerylongpathVerylongpathVerylongpath\
VerylongpathVerylongpathVerylongpathVerylong
pathVerylongpathVerylongpathVerylongpath
VerylongpathVerylongpathVerylongpathVerylongpath.t
xt
File path length: 272
The file exists!
The file can be read!
The file can be written!
It's a file!
The content in the file:
    This is only a test!
Rename sucessful!
The renamed file deleted!

从尝试中得以知道的看到,在本子 JDK 5.0
中,全体的文本操作(新建、读写、属性操作、重命名、删除等)都能够获取不错的拍卖。使用
JDK 5.0 就能够完全不用担心长路径名文件的应用难题。

唯独,大家又何以获得一个文本或目录的短文件名吧?其实系统现已给大家提供了那几个工具,很简短,在CMD控制埃德蒙顿运维dir /n
/x,那么当前目录下的公文名就以长/短二种方式突显出来,接下去就不要自个儿说了吧…

然则,大家又怎么着取得三个文书或目录的短文件名吧?其实系统已经给大家提供了这么些工具,很简单,在CMD控制德雷斯顿运作
dir /n
/x,那么当前目录下的文本名就以长/短二种艺术展现出来,接下去就不用作者说了吧…

在 C/C++ 中采纳长路径名文件

周旋于 JDK 5.0 不须求任何改变就能够支撑长路径名文件,在 C/C++ 中应用超越260个字符的门径长度的文本,会复杂得多。上边介绍两种帮忙长路径名文件的方式。

后记:

后记:

方法一:使用 Unicode 版本的 API

从微软官方网站 Path Field
Limits.aspx),能够查到,使用
Unicode 版本的 API,对于利用 NTFS 文件系统的 Windows NT 4.0, Windows
两千, Windows XP Home 艾德ition, Windows XP Professional 和 Windows Server
二零零零 操作系统,能够匡助 32768 字节的文书路径长度。同时,路径名必须选用
\\?\ 的前缀。根据那个思路,大家设计了实验。

清单 4. 对长路径名文件操作的 C 的言传身教代码(Unicode API)

{
FILE *from, *to;
char filename[1024];
strcpy(filename,"\\\\?\\E:\\VerylongpathVerylongpath
VerylongpathVerylongpathVerylongpathV
erylongpathVerylongpathVerylongpathVerylongpathVerylongpathVerylongpath
\\VerylongpathVeryl
ongpathVerylongpathVerylongpathVerylongpathVerylongpath
VerylongpathVerylongpathVerylongpat
hVerylongpathVerylongpath.txt");
int iL1=MultiByteToWideChar(CP_ACP, 0, filename,
 strlen(filename), NULL, 0); 
WCHAR* wfilename=new WCHAR[iL1+1]; 
wfilename[iL1] = '\0';
int iL2=MultiByteToWideChar(CP_ACP, 0, filename, 
strlen(filename), wfilename, iL1); 
from = _wfopen( wfilename ,L"rb");
to = fopen(".\\longpath.txt", "wb");
if((from ==NULL)||(to==NULL))
    return -1;
char buffer[1024];
int count = 0;
while ( (count = fread(buffer, sizeof(char), 1024, from)) != 0)
    fwrite( buffer, sizeof(char), count, to);
delete []wfilename;
fclose (from); fclose(to);
}

采用如上的点子,我们能够拷贝某长路径名的文件到眼下文件夹中。从测验结果看,该措施是有效的。然则,由于该方式须求系统应用
Unicode 的
API,同时要求转移路线名称以及编码格局。由此,对于1个早已存在的种类,由于须要变更全部文件操作相关的
API,由此改变将会不小。

现行反革命亟需PATH环境变量的次第更加多,PATH的上空也尤为小,真不知道此难题要哪一天才能迎刃而解。刚刚笔者在Microsoft的网站上找到了叁个关于PATH长度限制补丁的印证,但出于整篇指东言西的叙述令人匪夷所思,大致是有3个得以把PATH扩展到2046字节的补丁已经发出去,然而平昔没找到下载地址。本文叙述的法门也只有是治标不治本,但在不限制长度PATH环境变量出现在此以前,其当成一种那种办法。

现行反革命内需PATH环境变量的程序越多,PATH的空中也愈来愈小,真不知道此难点要曾几何时才能缓解。刚刚笔者在Microsoft的网站上找到了叁个关于PATH长度限制补丁的辨证,但出于整篇指东言西的讲述令人匪夷所思,大致是有2个方可把PATH扩充到2046字节的补丁已经发出去,可是平素没找到下载地址。本文叙述的法子也可是是治标不治本,但在不限制长度PATH环境变量出现在此以前,其当成一种那种格局。

措施二:制造 8.3 格式的鸿沟径名

对此每多少个长路径名,都有四个 8.3 格式(8 个字符的文书名和 3个字符的后缀名)的堵塞径名与其相呼应,任意的文本夹或许文件名都能够映射成二个8 字符的公文名(A~B),在那之中 A 是文件名前缀,B
是代表字母序的各类。操作系统能够确定保证那样的投射是一定的,只要采用GetShortPathName()
将长路径名转成相应的隔开分离径名,就足以开始展览对该公文实行普通的文本操作。同时,在其它时候都足以用函数
GetLongPathName() 把 8.3 格式的短路径名苏醒成初始的长路径名。

如 GetShortPathName
Function 讲述,我们须求二个Unicode 版本的 API,同时在路线名前加上 \\?\
的前缀,才能落到实处长短路径名间的切换。但从尝试来看,尽管不采纳 Unicode 的
API,还是能够完成上述功能。

清单 5. 对长路径名文件操作的 c 的示范代码(ShortPath)

{
char pathName [1024];
strcpy(pathName,"\\\\?\\E:\\VerylongpathVerylongpathVerylongpath
VerylongpathVerylongpathV
erylongpathVerylongpathVerylongpathVerylongpathVerylongpathVerylongpath
\\VerylongpathVeryl
ongpathVerylongpathVerylongpathVerylongpathVerylongpathVerylongpath
VerylongpathVerylongpat
hVerylongpathVerylongpath.txt");

const int MaxPathLength = 2048;
char shortPath[MaxPathLength];

if (strlen(pathName) >= MAX_PATH)
{
    char prePath[] = "\\\\?\\";
    if (strlen(pathName) >= MaxPathLength - strlen(pathName))
        return false;

    sprintf(shortPath, "%s%s", prePath, pathName);

    for (int iPathIndex = 0; iPathIndex < strlen(shortPath); iPathIndex++)
        if (shortPath[iPathIndex] == '/')
            shortPath[iPathIndex] = '\\';

    int dwlen = GetShortPathName(shortPath, shortPath, MaxPathLength);
    if (dwlen <= 0)
        return false;
}
}

透过上述的代码,超越 MAX_PATH 限制的门道名都能够转变成3个 8.3
格式的隔开分离径名,能够把那个文件名
(shortPath)作为再三再四文件操作函数的参数。那种气象下,对于该公文的具有操作都可以被接济了。咱们用那种缩小路径名长度的办法缓解了长路径名文件的操作难题。

结束语

正文首先列出了分裂的 JDK 版本在 Windows
操作系统上对于长路径名文件处理的分别,同时建议了 JDK 5.0
起首才完全支持长路径名;在第3片段中提交了二种扶助长路径名文件的 C/C++
编制程序方法。使用上文中的任一方法,大家都能够兑现对长路径名文件的操作,那将在相当的大程度上便宜大家的付出工作,消除在
Windows 平台上规范 API 函数对长路径名文件扶助的局限性难点。

相关文章