Re: file operations and XProc

>One of the only weaknesses of XProc (as I can see it), is the lack of
>any kind of file operation management.
>
>Standard file operations are;
>
>    * copy
>    * move
>    * delete
>    * which file is more up to date (compare file metadata)
>    * change file encoding (this is a biggie no?)
>    * chown/chmod
>
>I can envisage an XProc step called  p:file-operation.

If dealing with XML files, you could sort of use p:store for copying and
p:sink for deleting (provided the WG clears up what "discards" means). The
combination of the two could be used for moving. Encoding could probably be
changeable if reserializing the document with a new encoding using p:store.

And yes, the rest aren't doable currently.

I agree that even with the mentioned workarounds above, it would be good to
add file and directory operations like those for two reasons:
1. They will work on all files.
2. File operations will be done faster on XML with such steps then with
those workarounds since the document won't have to be parsed.

However, I don't think a single step for it all is a good idea. File
operations are too different to combine in a single step. It will make much
clutter. Perhaps a set of p:directory-* and p:file-* steps would do best.

To be more precise, I propose the following definitions:
<p:declare-step type="p:file-copy">
	<p:output port="result"/><!-- Returns a c:result element having
"file" and "location" with their respective values, or error if unable to
copy -->
	<p:option name="file"/><!-- The file to copy -->
	<p:option name="location"/><!-- The location and name of the new
file -->
</p:declare-step>

<p:declare-step type="p:directory-copy">
	<p:output port="result"/><!-- Returns a c:result element having
"file" and "location" with their respective values, or error if unable to
copy -->
	<p:option name="directory"/><!-- The directory (and all of its
contents) to copy -->
	<p:option name="location"/><!-- The location and name of the new
directory -->
</p:declare-step>

<p:declare-step type="p:file-delete">
	<p:option name="file"/><!-- The file to delete. -->
</p:declare-step>

<p:declare-step type="p:directory-delete">
	<p:option name="directory"/><!-- The directory to delete. Before you
suggest that this is combined with p:fil-->
</p:declare-step>

<p:declare-step type="p:file-recode">
	<p:output port="result"/><!-- Returns a c:result element having
"file" and "location" with their respective values, or error if unable to
recode-->
	<p:option name="file"/><!-- The file to recode -->
	<p:option name="encoding"/><!-- The new encoding of the file.
Implementations should automatically detect the current encoding.-->
	<p:option name="location"/><!-- The location for a new file using
the specified encoding -->
</p:declare-step>

<p:declare-step type="p:get-file-information">
	<p:output port="result"/><!-- Returns a c:result element having
"file" and "information" with their respective values and the result of the
query as contents of c:result, or error if unable to get the information-->
	<p:option name="file"/><!-- The file to get meta data from -->
	<p:option name="information"/><!-- The exact information to query
for. Possible values may include "creation-timestamp",
"last-modificaiton-timestamp","is-read-only" and more -->
</p:declare-step>

<p:declare-step type="p:get-directory-information">
	<p:output port="result"/><!-- Returns a c:result element having
"file" and "information" with their respective values and the result of the
query as contents of c:result, or error if unable to get the information-->
	<p:option name="directory"/><!-- The directory to get meta data from
-->
	<p:option name="information"/><!-- The exact information to query
for. Possible values may include "creation-timestamp",
"last-modificaiton-timestamp","read-only" and more -->
</p:declare-step>

<p:declare-step type="p:set-file-information">
	<p:output port="result"/><!-- Returns a c:result element having
"file" and "information" with their respective values and new value as
contents of c:result, or error if unable to get or set the information-->
	<p:option name="file"/><!-- The file to get meta data from -->
	<p:option name="information"/><!-- The exact information to query
for. Possible values may include "creation-timestamp",
"last-modificaiton-timestamp","is-read-only" and more -->
</p:declare-step>

<p:declare-step type="p:set-directory-information">
	<p:output port="result"/><!-- Returns a c:result element having
"file" and "information" with their respective values and new value as
contents of c:result, or error if unable to get or set the information-->
	<p:option name="directory"/><!-- The directory to get meta data from
-->
	<p:option name="information"/><!-- The exact information to query
for. Possible values may include "creation-timestamp",
"last-modificaiton-timestamp","read-only" and more -->
	<p:option name="new-value"/><!-- The new value of this information
-->
</p:declare-step>

I'm not sure if there's a point of creating p:file-move and p:directory-move
with p:*-delete in place, but if they are created, their signatures should
probably be as p:*-copy.

Regards,
Vasil Rangelov

Received on Thursday, 13 September 2007 08:16:30 UTC