001/*
002*根据一项或多项授权给Apache Software Foundation(ASF)
003*出资人许可协议。请参阅与一起分发的NOTICE文件
004*这篇文章是关于版权所有权的其他信息。
005*ASF根据Apache许可证2.0版将此文件授权给您
006*(“许可证”);除非符合
007*许可证。您可以在以下地址获得许可证副本:
008*
009*      http://www.apache.org/licenses/LICENSE-2.0
010*
011*除非适用法律要求或书面同意,否则软件
012*根据许可证分发是在“按原样”的基础上分发的,
013*无任何明示或暗示的保证或条件。
014*有关管理权限的特定语言和
015*许可证下的限制。
016*/
017
018软件包org.apache.commons.net.ftp;
019
020导入java.io.Serializable;
021导入java.time。即时;
022导入java.util。日历;
023导入java.util。日期;
024导入java.util。格式化程序;
025导入java.util。时区;
026
027/**
028*FTPFile类用于表示有关存储在FTP服务器上的文件的信息。
029*
030*@参见FTPFileEntryParser
031*@请参阅FTPClient#listFiles
032*/
033公共类FTPFile实现Serializable{
034
035private static final long serialVersionUID=9010790363003271996L;
036
037/**表示FTPFile是文件的常量*/
038公共静态最终int FILE_TYPE=0;
039
040/**表示FTPFile是目录的常量*/
041公共静态最终int DIRECTORY_TYPE=1;
042
043/**表示FTPFile的常量是符号链接*/
044公共静态最终int SYMBOLIC_LINK_TYPE=2;
045
046/**指示FTPFile的常量的类型未知*/
047公共静态最终int UNKNOWN_TYPE=3;
048
049/**指示用户访问权限的常数*/
050公共静态最终int USER_ACCESS=0;
051
052/**指示组访问权限的常量*/
053public static final int GROUP_ACCESS=1;
054
055/**一个表示世界访问权限的常量*/
056公共静态最终int WORLD_ACCESS=2;
057
058/**指示文件/目录读取权限的常量*/
059公共静态最终int READ_PERMISSION=0;
060
061/**表示文件/目录写入权限的常量*/
062公共静态最终int WRITE_PERMISSION=1;
063
064/**指示文件执行权限或目录列表权限的常量*/
065public static final int EXECUTE_PERMISSION=2;
066
067private int type=UNKNOWN_type;
068
069/**0作为链接计数无效*/
070私有int hardLinkCount;
071
072/**0有效,因此使用-1*/
073私有长尺寸=-1;
074私有字符串rawListing;
075private String user=“”;
076private字符串组=“”;
077私有字符串名称;
078私有字符串链接;
079
080//TODO考虑将内部表示更改为java.time。
081私人日历;
082
083/**如果为空,则列表条目解析失败*/
084private final boolean[][]权限;//例如_permissions[USER_ACCESS][READ_PERMISSION]
085
086/**创建空的FTPFile*/
087公共FTPFile(){
088权限=新布尔值[3];
089}
090
091/**
092*仅供{@link FTPListParseEngine}使用的构造函数。用于为失败的分析创建FTPFile条目
093*
094*无法解析的@param rawListing行。
095*@自3.4起
096*/
097FTPFile(最终字符串原始列表){
098this.permissions=空;//标记条目无效
099this.rawListing=rawListing;
100}
101
102私有字符格式Type(){
103开关(类型){
104案例文件类型:
105返回“-”;
106案例DIRECTORY_TYPE:
107返回'd';
108案例SYMBOLIC_LINK_TYPE:
109返回'l';
110违约:
111返回“?”;
112}
113}
114
115/**
116*获取拥有该文件的组的名称。有时这将是组号的字符串表示。
117*
118*@return拥有文件的组的名称。
119*/
120公共字符串getGroup(){
121回归组;
122}
123
124/**
125*获取指向此文件的硬链接数。这不能与符号链接混淆。
126*
127*@return指向该文件的硬链接数。
128*/
129public int getHardLinkCount(){
130return hardLinkCount;
131}
132
133/**
134*如果FTPFile是符号链接,则此方法返回符号链接所指向的文件的名称。
135*否则,它将返回{@code null}。
136*
137*@return符号链接指向的文件(如果FTPFile不是符号链接,则为{@code null})。
138*/
139公共字符串getLink(){
140回流环节;
141}
142
143/**
144*获取文件的名称。
145*
146*@return文件的名称。
147*/
148公共字符串getName(){
149返回名称;
150}
151
152/**
153*获取用于初始化FTPFile的原始FTP服务器原始列表。
154*
155*@return用于初始化FTPFile的原始FTP服务器原始列表。
156*/
157公共字符串getRawListing(){
158return rawListing;
159}
160
161/**
162*获取文件大小(以字节为单位)。
163*
164*@return文件大小(以字节为单位)。
165*/
166public long getSize(){
167回报规模;
168}
169
170/**
171*获取文件时间戳。这通常是最后一次修改时间。
172*
173*@return表示文件时间戳的Calendar实例。
174*/
175公共日历getTimestamp(){
176返回日历;
177}
178
179/**
180*获取文件时间戳。这通常是最后一次修改时间。
181*
182*@return表示文件时间戳的Calendar实例。
183*@自3.9.0起
184*/
185公共即时getTimestampInstant(){
186return calendar==空?null:日历.toInstant();
187}
188
189/**
190*获取文件的类型({@code_type}常量之一),例如,如果它是目录、常规文件或符号链接。
191*
192*@return文件的类型。
193*/
194public int getType(){
195返回类型;
196}
197
198/**
199*获取拥有该文件的用户的名称。有时这将是用户编号的字符串表示。
200*
201*@return拥有文件的用户的名称。
202*/
203公共字符串getUser(){
204返回用户;
205}
206
207/**
208*测试给定的访问组({@code_access}常量之一)是否具有给定的访问权限({@code _permission}之一
209*常量)。
210*
211*@param access访问组({@code _access}常量之一)
212*@param permission访问权限({@code_permission}常量之一)
213*如果任一参数超出范围,则返回@throws ArrayIndexOutOfBoundsException
214*如果{@link#isValid()}为{@code true}并且设置了相关权限,则返回{@code true};{@code false}否则。
215*/
216public boolean hasPermission(final int access,final int permission){
217if(权限==空){
218返回false;
219}
220返回权限[access][permission];
221}
222
223/**
224*测试文件是否为目录。
225*
226*如果文件类型为{@code DIRECTORY_type},则返回{@code true};否则返回{@code false}。
227*/
228公共布尔值isDirectory(){
229返回类型==DIRECTORY_type;
230}
231
232/**
233*测试文件是否为常规文件。
234*
235*如果文件类型为{@code file_type},则返回{@code true};否则返回{@code false}。
236*/
237公共布尔值isFile(){
238返回类型==FILE_type;
239}
240
241/**
242*测试文件是否为符号链接。
243*
244*如果文件类型为{@code SYMBOLIC_LINK_type},则返回{@code true},否则返回{@code false}。
245*/
246公共布尔值isSymbolicLink(){
247返回类型==SYMBOLIC_LINK_type;
248}
249
250/**
251*测试文件的类型是否未知。
252*
253*如果文件的类型为{@code UNKNOWN_type},则返回{@code true};否则返回{@code false}。
254*/
255公共布尔值isUnknown(){
256返回类型==UNKNOWN_type;
257}
258
259/**
260*测试条目是否有效。如果条目无效,则只有{@link#getRawListing()}方法才有用。其他方法可能会失败。
261*
262*与列表分析结合使用,以保留分析失败的条目。
263*
264*@请参阅FTPClientConfig#setUnparseableEntries(布尔值)
265*@return{@code true},如果条目有效;{@code false}否则
266*@自3.4起
267*/
268公共布尔值isValid(){
269返回权限!=无效的;
270}
271
272private String permissionToString(最终int访问){
273final StringBuilder sb=新StringBuilder();
274if(hasPermission(访问,READ_PERMISSION)){
275某人附加(‘r’);
276}其他{
277某人追加(“-”);
278}
279if(hasPermission(access,WRITE_PERMISSION)){
280某人追加(“w”);
281}其他{
282某人追加(“-”);
283}
284if(hasPermission(access,EXECUTE_PERMISSION)){
285某人追加('x');
286}其他{
287某人附加('-);
288}
289将某人返回字符串();
290}
291
292private void readObject(中的最终java.io.ObjectInputStream){
293抛出新的UnsupportedOperationException(“不支持序列化”);
294}
295
296/**
297*设置拥有文件的组的名称。这可能是组号的字符串表示。
298*
299*@param group拥有文件的组的名称。
300*/
301public void setGroup(最终的String组){
302this.group=组;
303}
304
305/**
306*设置指向此文件的硬链接数。这不能与符号链接混淆。
307*
308*@param links指向此文件的硬链接数。
309*/
310public void setHardLinkCount(最终int链接){
311this.hardLinkCount=链接;
312}
313
314/**
315*如果FTPFile是符号链接,请使用此方法设置符号链接指向的文件的名称。
316*
317*@param link符号链接指向的文件。
318*/
319public void setLink(最终字符串链接){
320this.link=链接;
321}
322
323/**
324*设置文件的名称。
325*
326*@param name文件的名称。
327*/
328public void setName(最终字符串名称){
329this.name=名称;
330}
331
332/**
333*设置给定的访问组({@code_access}常量之一)是否具有给定的访问权限({@code _permission}之一
334*常量)。
335*
336*@param access访问组({@code _access}常量之一)
337*@param permission访问权限({@code_permission}常量之一)
338*@param value{@code true}如果允许权限,{@code false}如果不允许。
339*如果任一参数超出范围,则返回@throws ArrayIndexOutOfBoundsException
340*/
341public void setPermission(final int access,final int permission,final boolean value){
342//TODO:仅在文件有效时允许权限设置
343permissions[access][permission]=值;
344}
345
346/**
347*设置创建FTPFile的原始FTP服务器原始列表。
348*
349*@param rawListing原始FTP服务器列表。
350*/
351public void setRawListing(最终字符串rawListing){
352this.rawListing=rawListing;
353}
354
355/**
356*以字节为单位设置文件大小。
357*
358*@param size文件大小(以字节为单位)。
359*/
360public void setSize(最终长尺寸){
361this.size=大小;
362}
363
364/**
365*设置文件时间戳。这通常是最后一次修改时间。参数未被克隆,因此在调用此方法后不要更改其值。
366*
367*@param date表示文件时间戳的Calendar实例。
368*/
369public void setTimestamp(最终日历日期){
370this.calendar=日期;
371}
372
373/**
374*设置文件的类型({@code DIRECTORY_type}、{@code file_type{等)。
375*
376*@param type表示文件类型的整数代码。
377*/
378public void setType(final int类型){
379this.type=类型;
380}
381
382/**
383*设置拥有文件的用户的名称。这可能是用户编号的字符串表示;
384*
385*@param user拥有文件的用户的名称。
386*/
387public void setUser(最终的String用户){
388this.user=用户;
389}
390
391/**
392*获取FTPFile信息的字符串表示形式。这目前模仿Unix列表格式。此方法使用日历的时区
393*条目,它是服务器时区(如果提供了),否则是本地时区。
394*<p>
395*注意:如果实例无效{@link#isValid()},则无法返回任何有用的信息。在这种情况下,请改用{@link#getRawListing()}。
396*</p>
397*
398*@return FTPFile信息的字符串表示。
399*@自3.0起
400*/
401公共字符串toFormattedString(){
402返回FormattedString(空);
403}
404
405/**
406*获取FTPFile信息的字符串表示形式。这目前模仿Unix列表格式。此方法允许日历时区
407*被覆盖。
408*<p>
409*注意:如果实例无效{@link#isValid()},则无法返回任何有用信息。在这种情况下,请改用{@link#getRawListing()}。
410*</p>
411*
412*@param timezone用于显示时间戳的时区如果{@code null},则使用日历({@link#getTimestamp()})条目
413*@return FTPFile信息的字符串表示。
414*@自3.4起
415*/
416public String to FormattedString(最终的String时区){
417
418if(!isValid()){
419return“[无效:无法解析文件条目]”;
420}
421final StringBuilder sb=新StringBuilders();
422try(最终格式化程序fmt=新格式化程序(sb)){
423sb.append(formatType());
424sb.append(permissionToString(USER_ACCESS));
425sb.append(permissionToString(GROUP_ACCESS));
426sb.append(permissionToString(WORLD_ACCESS));
427fmt.format(“%4d”,Integer.valueOf(getHardLinkCount()));
428fmt.format(“%-8s%-8s”,getUser(),getGroup());
429fmt.format(“%8d”,Long.valueOf(getSize()));
430日历时间戳=getTimestamp();
431if(时间戳!=空){
432if(时区!=空){
433final TimeZone newZone=TimeZone.getTimeZone(时区);
434if(!newZone.equals(timestamp.getTimeZone())){
435最终原始日期=timestamp.getTime();
436final Calendar newStamp=Calendar.getInstance(newZone);
437newStamp.setTime(原始);
438timestamp=newStamp;
439}
440}
441fmt.format(“%1$tY-%1$tm-%1$td”,时间戳);
442//仅显示时间单位(如果存在)
443if(timestamp.isSet(Calendar.HOUR_OF_DAY)){
444fmt.format(“%1$tH”,时间戳);
445if(timestamp.isSet(Calendar.MINUTE)){
446fmt.format(“:%1$tM”,时间戳);
447if(timestamp.isSet(Calendar.SECOND)){
448fmt.format(“:%1$tS”,时间戳);
449if(timestamp.isSet(Calendar.MILLISECOND)){
450fmt.format(“.%1$tL”,时间戳);
451}
452}
453}
454fmt.format(“%1$tZ”,时间戳);
455}
456}
457某人追加(“”);
458sb.append(getName());
459}
460将某人返回字符串();
461}
462
463/*
464*此类不需要序列化。拒绝尝试这样做,直到可以删除Serializable属性。
465*/
466
467/**
468*获取FTPFile信息的字符串表示形式。
469*委托到{@link#getRawListing()}
470*
471*@参见#getRawListing()
472*@return FTPFile信息的字符串表示。
473*/
474@覆盖
475公共字符串toString(){
476return getRawListing();
477}
478
479private void writeObject(最终java.io.ObjectOutputStream输出){
480抛出新的UnsupportedOperationException(“不支持序列化”);
481}
482
483}