附图说明
当结合附图阅读时,能更好地理解前述对本发明的概述,以及下文中对说明性实施例的详细描述,附图作为示例而非作为关于所要求保护的本发明的限制而被包括在内。
图1是可用于本发明的各方面的说明性计算设备的功能框图。
图2根据本发明的至少一个方面在功能上示出了可以被采取来跨存储移动项的步骤。
图3根据本方面的至少一个方面在功能上示出了可以被采取来移回项的步骤,从而该步骤是图2所示的操作的逆操作。
图4根据本发明的至少一个方面在功能上示出了可以被采取来将项添加至列表的步骤。
图5根据本发明的至少一个方面在功能上示出了可以被采取来将项从列表中移除的步骤。
图6根据本发明的至少一个方面在功能上示出了可以被采取来复制项的步骤。
图7根据本发明的至少一个方面在功能上示出了可以被采取来在相同的存储内移动列表的步骤。
图8根据本发明的至少一个方面在功能上示出了可以被采取来跨存储“浅”移动列表的步骤。
图9根据本发明的至少一个方面在功能上示出了可以被采取来跨存储“浅”移回列表的步骤,从而该步骤是图8中所示的操作的逆操作。
图10根据本发明的至少一个方面在功能上示出了可以被采取来跨存储“结构”移动列表的步骤。
图11根据本发明的至少一个方面在功能上示出了可以被采取来跨存储“结构”移回列表的步骤,从而该步骤是图10中所示的操作的逆操作。
图12根据本发明的至少一个方面在功能上示出了可以被采取来跨存储“深”移动列表的步骤。
图13根据本发明的至少一个方面在功能上示出了可以被采取来跨存储“深”移回列表的步骤,从而该步骤是图12中所示的操作的逆操作。
图14根据本发明的至少一个方面在功能上示出了可以被采取来跨存储“浅”复制列表的步骤。
图15根据本发明的至少一个方面在功能上示出了可以被采取来跨存储“结构”复制列表的步骤。
图16根据本发明的至少一个方面在功能上示出了可以被采取来跨存储“深”复制列表的步骤。
图17根据本发明的至少一个方面在功能上示出了可以被采取来擦去列表的步骤。
图18根据本发明的至少一个方面在功能上示出了可以被采取来回收列表的步骤。
具体实施方式
说明性计算环境
本发明的各方面可以结合诸如图1中说明性地示出的计算机100等计算设备来使用。计算机100的组件可以包括,但不限于,处理单元120、系统存储器130和将包括系统存储器130在内的各种系统组件耦合至处理单元120的系统总线121。系统总线121可以是若干类型的总线结构中的任一种,包括存储器总线或存储器控制器、外围总线和使用各种总线体系结构中的任一种的局部总线。
系统存储器130包括易失性或非易失性存储器形式的计算机存储介质,诸如只读存储器(ROM)131和随机存取存储器(RAM)132。基本输入/输出系统133(BIOS)包含有助于诸如启动时在计算机100中元件之间传递信息的基本例程,它通常存储在ROM 131中。RAM 132通常包含处理单元120可以立即访问和/或目前正在操作的数据和/或程序模块。计算机100也存储和/或执行操作系统134、一个或多个应用程序135、其它程序模块136和/或程序数据137。计算机100也可以包括其它可移动/不可移动、易失性/非易失性计算机存储介质。仅作为示例,图1示出了从不可移动、非易失性磁介质中读取或向其写入的硬盘驱动器141,从可移动、非易失性磁盘152中读取或向其写入的磁盘驱动器151,以及从诸如CD ROM或其它光学介质等可移动、非易失性光盘156中读取或向其写入的光盘驱动器155。可以使用的其它可移动/不可移动、易失性/非易失性计算机存储介质包括,例如,盒式磁带、闪存卡、数字多功能盘、数字录像带、固态RAM、固态ROM等。硬盘驱动器141通常由不可移动存储器接口,诸如接口140连接至系统总线121,磁盘驱动器151和光盘驱动器155通常由可移动存储器接口,诸如接口150连接至系统总线121。在所示示例中,硬盘驱动器141例如可以被认为是一个存储,而在光盘驱动器155中使用的CD ROM可以被认为是另一个不同的存储。另外,硬盘驱动器141内的分区可以被认为是不同的存储。作为另一个示例,多个内置硬盘驱动器可以按所需的被配置为单个大存储或多个较小的独立存储。
存储在各个计算机存储介质中任何一个上的数据可以用各种格式来存储。例如,数据可以存储在诸如文件或其它项等离散的部分中。电子文件系统可以是操作系统134的一部分和/或可以从操作系统中分离,它可以负责管理存储、检索和/或搜索计算机存储介质上的项和其它数据。电子文件系统可以被实现为软件、硬件和/或固件。
用户可以通过输入设备,诸如键盘162和/或定点设备161(通常指鼠标、跟踪球或触摸垫)向计算机100输入命令和信息。其它输入设备(未示出)可以包括麦克风、操纵杆、游戏垫、圆盘式卫星天线、扫描仪等。这些和其它输入设备通常由耦合至系统总线121的用户输入接口160连接至处理单元120,但也可以由其它接口或总线结构,诸如并行端口、游戏端口或通用串行总线(USB)连接。监视器191或其它类型的显示设备也经由接口,诸如视频接口190连接至系统总线121。计算机100还可以包括其它外围输出设备,诸如扬声器197和打印机196,它们可以通过输出外围接口195连接至系统总线121。
在某些方面,提供了笔数字化仪165和附属的笔或触针166,以数字化地捕捉手画线输入。尽管示出了笔数字化仪165和用户输入接口160之间的直接连接,但在实际上,笔数字化仪165可以直接地、通过并行端口或其它接口以及通过系统总线121或者有线或者无线地来耦合至处理器单元120。笔166还可以含有用于确定电子墨迹的笔划的其它传感系统,包括例如加速计和磁强计。
计算机100可使用至一个或多个远程计算机,诸如远程计算机180的逻辑连接在网络化环境下操作。远程计算机180可以是个人计算机、服务器、路由器、网络PC、对等设备或其它常见网络节点,且通常包括上文相对于计算机100描述的许多或所有元件,尽管在图1中仅作为示例示出存储器存储设备181。如图1中所示计算机100外部的说明性的逻辑连接包括局域网(LAN)171和/或广域网(WAN)173,且也可以包括其它网络。这样的联网环境在办公室、企业范围计算机网络、内联网和因特网中是常见的。计算机100还可以包括有线和/或无线能力。例如,网络接口170可以是蓝牙、SWLan和/或IEEE 802.11兼容的。可以理解,可以结合这些协议或替代这些协议来使用其它无线通信协议。
当在LAN网络环境中使用时,计算机100通过网络接口或适配器170连接至局域网171。当在WAN网络环境中使用时,计算机100通常包括调制解调器172或用于通过诸如因特网等WAN 173建立通信的其它装置。调制解调器172可以是内置或外置的,它可以通过用户输入接口160或其它合适的机制连接至系统总线121。
计算机100外部的远程计算机180和/或其它设备的存储介质也可被认为是可由电子文件系统通过计算机100外部的逻辑连接来访问的附加存储。例如,远程计算机180的硬盘驱动器可以由在计算机100上执行的电子文件系统访问,且硬盘驱动器(和/或诸如另一个硬盘驱动器等与硬盘驱动器组合的其它存储设备)本身也可被认为是存储。或者,计算机100外部的一个或多个服务器可以由电子文件系统通过因特网来访问,且这些服务器或服务器组中的每一个可以被认为是存储。
电子文件系统所利用的说明性组织结构
在计算机100上执行的电子文件系统可以利用项的有向无环图(DAG)组织。项可以是几乎任何类型的离散数据结构,诸如文件(例如,文字处理文件、照片、MP3歌曲等)、联系人、日历项、电子邮件项或者甚至是其它项的列表。列表类型的项可以是或可以不是已排序列表,且可以被认为是类似于传统文件夹。当列表列出项时,该列表被认为是父项,而该项被认为是子项。此处,如果项是由父列表列出的,子项被称为直接在父列表下组织。这也被称为父列表和子项之间的持有关系。此处,如果项是在父列表下直接或间接组织的,则子项被称为在父列表下组织,如下文关于图7所示的。为了提供完全DAG体系结构的添加的灵活性,多个不同的列表可以都列出或在下方含有相同的项。换言之,一个项可以拥有多个父项。
例如,图7的顶端部分在功能上示出了可以由电子文件系统利用和管理的说明性组织结构。在该示例中,列表L2直接在列表L1、列表L4和列表L6中的每一个下组织。这样,列表L2拥有三个直接父项。列表L3直接在列表L2下组织,但是它也在列表L1、L6和L4下(虽然是间接地)组织。非列表项I1(例如,文件或纯粹不用文件流来模式化的背后无文件(non-file-backed)项)直接在列表L3下组织,并间接在列表L1、L2、L4和L6下组织。非列表项I2直接在列表L2下组织,且间接在列表L1、L4和L6下组织。
另外,电子文件系统可以提供在其中可以放置一个或多个项的一个或多个工作空间。工作空间中的项可以拥有或不拥有相对于该工作空间中另一个项的组织。例如,项L1、L2、L3、L4、L6、I1和I2可以在相同的工作空间中,该工作空间可以在功能上看作是封住这些项的盒子。这些项中的每一个拥有相对于其它项的组织。然而,列表L5(图7)也可以位于相同的工作空间中但可以不拥有相对于其它项的组织。在该示例中,列表L5被认为是“浮动”项,如同列表L1和L4一样。如果项没有被任何其它项持有或在任何其它项之下组织,那么该项是浮动项。如果项被置于工作空间中,它将保持在该工作空间中直到它被从工作空间中移除。这样,在工作空间内,项可以按照(或者可以不按照)所需的组织,而不影响该项是否在工作空间内。
一旦利用了上述的组织结构,存在管理项时需要考虑的某些问题。例如,因为项可以直接或间接地在一个以上父列表下组织,因此存在多种可能的方式来处理移动或复制项的请求。可能用户想要从一个父列表处而不必从其它父列表处移动项。事实上,用户可能甚至不知道其它父列表的存在或它们持有试图移动的项。以下描述这些情景的示例和说明性解决方案。
非列表项操作
以下是可以在项上执行的操作的示例。操作可以在同一存储内或跨存储(“横跨存储”)进行。例如,项可以从一个位置移动到同一存储内的另一个位置。或者,项可以横跨存储从一个存储移至另一个存储。下文将描述这两者的示例。
移动项-横跨存储
为讨论的目的,假定持有链接不能横跨存储。从而,如果项同时位于第一存储的两个不同组织中(例如,在两个不同的列表中),且如果用户试图将这些组织中的一个移动至第二存储,那么存在处理该问题的若干可能的方式。参考图2,例如,项I1同时由存储1中的列表L1和L2持有。存储2含有列表L3。假设用户想要将项I1从列表L2移动至列表L3。第一种可能是,将项I1移动至存储2以使得位于列表L3中。然而,这可能打破I1也位于列表L1和L2的组织。这可能不是用户的意图,尤其考虑用户可能没有与列表L1交互过,且实际上甚至可能不知道列表L1。第二种可能是项I1将被复制到列表L3。然而,这也会改变整个组织,因为现在将有项I1的两个副本。这可能不是期望的结果,因为用户想要移动项I1(而不是复制项I1),这可能是为了释放存储1的存储空间。第三种可能是移动操作可能失败,但是大多数用户会觉得该结果是令人恼怒的。第四种可能是将项I1转化为代理项。代理项是对被指向项(即项I1)的元数据的快捷方式或指针。第四种可能允许组织尽可能接近地模拟移动前的组织。
参考显示了第四种可能的图2,使用有圆圈的数字显示步骤(不必按照顺序排列),而将项显示为框。如该示例中所示,在步骤1和2中,项I1从存储1的列表L2移动至存储2中的列表L3。具体地,在步骤1中,项I1被串行化为二进制大对象(blob)B1,B1表示项I1的副本。然后,在步骤2中,二进制大对象B1被反串行化为项I1(2),该项由列表L3持有。尽管在此处将该新的项称为项I1(2),然而项I1(2)是原始项I1的副本。命名方案仅用于讨论的目的,且仅用于区分项I1(2)在技术上不是原始的项I1。换言之,项I1(2)可以利用不同于原始项I1的存储(例如,不同的硬盘驱动器上的不同扇区),即使它在其它方面是项I1的副本。副本可以通过将项(例如,项I1)串行化为二进制大对象且然后将该二进制大对象反串行化为另一个项(例如,项I1(2))来制作。
仍旧参考图2,在步骤3中,项I1被转化为指向项I1(2)的快捷方式(或代理项)。代理项是指向或链接至目标项但不含有目标项的所有实质数据的项。其原因是用户仅想要从列表L2中移动项I1,但是不必也从也拥有项I1上的持有链接的列表L1中移动。这样,通过创建对项I1(2)的代理项,在列表L1下方观察的用户仍旧将看到项I1好像它从未被移动操作影响。这可能是仅请求从列表L2中移动项I1而没有涉及列表L1的用户的意图。同样,通过重置或将项I1转化为代理项,释放了存储1中的存储空间,这与用户将项I1从存储1移动到存储2的意图一致。如果原始项I1被维护在存储1中,因为它也被列表L1持有,那么移动操作可能没有释放存储1中的存储空间。这样的结果可能与用户的意图相背。最后,在步骤4中,列表L2和项I1之间的关系被这样处理,使得项I1不再由列表L2列出,如用户可能的意图。这样,结果是项I1现在由列表L1(虽然作为代理项)和列表L3列出,但是不由列表L2列出。
移回项-横跨存储
如前所述,可能想要以最可能匹配用户期望和希望的可预测方式在项上操作。这包括可逆性。换言之,可能希望通过启动改变一个或多个项的组织的第一动作,且然后通过执行逆动作,组织应该还原为第一动作之前存在的原始组织。尽管可逆性不是必须的,但是对此处描述某些或全部操作可能是合乎需要的。例如,如果用户最初如关于图2描述的将项I1移动至列表L3,那么然后如果用户立即执行将项I1(2)移动至列表L2的移动操作,那么所得的组织较佳地应当与最初的移动操作之前的原始组织相同。这在图3中说明性地示出。首先,在步骤1中,项I1(2)被串行化为表示项I1(2)的副本的二进制大对象B1。在步骤2中,确定是否存在目标是将被移动的项的代理项。在该示例中,这样的代理项的确存在;代理项I1目标为将被移动的项I1(2)。如果这样的代理项存在,那么该代理项被移除并使用项I1(2)的副本替换,在这一情况下,项I1(2)的副本也被称为项I1。如果这样的代理项不存在,那么不需移除或替换代理项。在任一情况下,项I1(2)被复制为项I1,项I1可通过将二进制大对象B1反串行化为项I1来完成。在步骤3中,因为项I1(2)仅由单个列表-列表L3列出,因此不需在列表L3下创建项I1的代理项。这样,项I1(2)从列表L3中移除(并从存储2中擦去)。由此,将项I1(2)移回列表L2的结果是与图2所示的原始组织相同的组织。
添加项
图4示出了其中项I1被添加至列表L1的说明性实施例。在该示例中,可以执行其中在项I1和列表L1之间创建持有关系的单个步骤,使得列表L1持有项I1。当然,项I1也可以被添加至其它列表,因为多个列表可以持有相同的项。另外,项I1也可以被添加,使得它不被任何列表所持有。这样的项在此处被称为浮动项。
移除项
图5示出了其中从列表L1中移除项I1(但是没有被回收或擦去)的说明性实施例。在这一情况下,项I1仅由列表L1持有,所以一旦从列表L1中移除,项I1称为不被任何列表持有的浮动项。如果项I1也被例如列表L2等其它列表所持有,那么从列表L1移除项I1的结果可能是项I1仅由列表L2持有。
复制项-同一存储
参考图6中示出的说明性实施例,用户可以请求在同一存储中复制项I1。一种可能是副本(项I1(2))被创建为浮动项。另一种可能是项I1(2)以与原始项I1相同的方式来组织。在后一情况下,在步骤1中,项I1被串行化为表示项I1的副本的二进制大对象B1。然后在步骤2中,二进制大对象B1被反串行化为项I1(2),并建立列表L1和项I1(2)之间的持有关系以匹配原始项I1和列表L1之间的持有关系。如果项I1由列表L1和另一个列表L2两者所持有,则项I1(2)仍旧被复制,使得它仅由列表L1所持有。这是因为在该示例中,原始项I1在列表L1的上下文中被复制,而列表L1的上下文中的动作不会影响诸如列表L2等其它独立列表。
列表操作
上述示例处理非列表项上的操作。可以执行非列表项上的其它操作,诸如回收和擦去。另外,也可以在列表上执行操作。这些被称为列表操作。例如,列表可以被复制、移动、添加、删除、回收或擦去。现在描述列表操作的示例。取决于如何执行列表操作,列表操作可以或多或少地影响围绕所选择的一个或多个列表的组织。
移动列表-同一存储
例如,列表可以在同一存储内被移动。这可以是相当直截了当的操作,诸如图7中所示的。这里,用户想要将列表L2从从列表L1移至列表L5。这样,从列表L1到列表L2的持有链接被打破,且从列表L5至列表L2建立了新的持有链接。因为该移动是在同一存储内做出的,因此无需影响诸如列表L3、L4和L6以及项I1和I2等剩余组织。
浅移动列表浅-横跨存储
此处描述的是存储之间的列表移动操作的三种形式。在第一种形似中,可以诸如图8中所示的执行“浅”移动。浅移动也被称为浅移动列表操作,它仅移动所选列表。这样,例如,当用户想要将列表L2从存储1的列表L1中浅移动至存储2中的列表L5时,可以执行下列步骤。在步骤1中,列表L2被串行化来创建表示列表L2的副本的二进制大对象B1。在步骤2中,二进制大对象B1被反串行化为列表L2(2),它是列表L2的副本。在步骤3中,因为仅有所选择的列表L2应该被移动至存储2中,所以创建列表L3的代理项,且创建从列表L2(2)至该代理项的持有链接。类似地,在步骤4中,创建项I2的代理项,且创建从列表L2(2)至该代理项的持有链接。这样,所得的组织是仅有所选择的列表L2本身被移动。在步骤5中,因为原始项L2由另一个列表(即,列表L6)所持有,因此项L2不应该被简单地擦去。否则,这会扰乱不被明确请求改变的组织。如前所述,用户仅想要从列表L1中而非任何其它列表中移动列表L2。这样,项L2或者被替换或者被转化为L2(2)的代理项,使得它仍旧可以被列表L6引用(在同一存储内)。在步骤6和7中,因为原始列表L2不再存在于存储1中,而是成为存储2中的列表L2(2),所以不再存在对列表L2和列表L3之间以及列表L2和项I2之间的持有链接的任何需求。这样,移除这些持有链接。因为项I2不再由任何其它列表所持有,因此项I2成为浮动项。作为这些操作的结果,存储2现在含有列表L2(2),列表L2(2)持有指向存储1中的列表L3和项I2的代理项。
浅移回列表-横跨存储
如前所述,当执行操作时,可能希望其逆操作会得到原始组织。现在在图9中示出这样的情景,其中用户想要将列表L2(2)从存储2中的列表L5中移动至存储1中的列表L1。在步骤1中,列表L2(2)被串行化以创建表示列表L2(2)的副本的二进制大对象B1。在步骤2中,确定存储1中是否存在列表L2(2)的代理项。在这一情况下,这样的代理项的确存在,使得使用二进制大对象B1替换该代理项,二进制大对象B1被反串行化为列表L2。换言之,解除列表L2的远程代理项对本地存储1的引用。同样,按照用户请求,列表L2被添加至列表L1。如果这样的代理项不存在,那么二进制大对象B1将仅被反串行化为列表L2并被添加至列表L1。在步骤3中,列表L3被添加至列表L2,来匹配L3的代理项(存储2中)的组织。在步骤4中,项I2被添加至列表L2,以匹配项I2的代理项(也在存储2中)的组织。这是通过解除项I2的代理项对本地存储1的引用来完成的。在步骤5中,对列表L3、项I2和列表L2(2)的代理项被擦去。如图9中所示的所得的组织与图8中所示的原始组织相同。
移动列表结构-横跨存储
结合图10描述此处讨论的移动列表操作的第二种形式。在该实例中,用户请求列表L2和列表L2下对应的组织结构从存储1中的列表L1移动至存储2中的列表L5。用户可能想要复制其中结构支持要求扩展存储空间的一组项的结构(但不是结构中所有非列表项)。例如,播放列表可以含有多个列表,每位歌手一个列表,在每一列表下有多个音乐文件。可以期望这样的播放列表中的文件总计为上千兆字节的音乐和/或视频数据。在这一情况下,用户可能不想通过将这些大文件从第一存储复制到第二存储来浪费存储空间(以及可能的网络带宽),而是相反,仅能够使用第二存储中复制的结构来引用原始存储中的文件。在步骤1中,列表L2被串行化为表示列表L2的副本的二进制大对象B1。在步骤2中,二进制大对象B1被反串行化为列表L2(2),它是列表L2的副本且现在被列表L5所持有。因为这是结构移动命令,所以也移动列表L3下的结构,即组织。与此相反,在前述关于图8讨论的浅移动命令中,仅移动列表L2。从而,在步骤3中,列表L3被串行化为表示列表L3的副本的二进制大对象B2,而在步骤4中,二进制大对象B2被反串行化为列表L3(2),它是列表L3的副本且现在被列表L2(2)所持有。也存在由原始列表L2直接或间接持有的若干非列表项(I1和I2),但是因为这些项不是结构化的,所以它们不被移动至存储2。相反,在步骤5和6中,在存储2中创建指向项I1和I2的代理项,而项I1和I2保留在存储1中。同样,因为原始列表L2和L3不再存在于存储1中(仅他们的代理,将在以下描述),所以在步骤7中,移除列表L3和项I1之间的持有关系,在步骤9中移除列表L2和列表L3之间的持有关系,且在步骤10中,移除列表L2和项I2之间的持有关系。因为项I1和I2不由其它任何列表所持有,所以项I1和I2成为浮动项。同样,因为列表L2和L3原始是由其它列表所持有的(分别是列表L1和L4),为了能够由列表L1和L4列出,它们不能在不维持存储1中对其的某些引用的情况下而被简单地移除。这样,在步骤8和11中,列表L2和L3的每一个使用存储1中分别指向存储2中的列表L2(2)和L3(2)的代理来替换。
结构移回列表-横跨存储
参考图11,用户现在想要执行与图10中执行的操作相反的操作。换言之,用户现在想要将列表L2(2)结构移回至存储1的列表L1下。在步骤1中,列表L2(2)被串行化为表示列表L2(2)的副本的二进制大对象B1,且在步骤2中,二进制大对象B1被反串行化为列表L2,且确定存储1中是否存在指向列表L2的代理项。在该情况下的确存在,所以使用列表L2替换代理项。同样,在步骤3中,列表L3(2)被串行化为表示列表L3(2)的副本的二进制大对象B2,且在步骤4中,二进制大对象B2被反串行化为列表L3且替换存储1中的代理项L3。在步骤5和6中,在列表L2和项I2以及列表L3和向I1之间建立持有链接。系统建立这些持有链接以便反映列表L2(2)和项I2以及列表L3(2)和项I1之间的现有结构。在步骤7和9中,项I1和I2的代理项被擦去。在步骤8和10中,列表L2(2)和L3(2)被擦去。这些操作导致存储2仅含有列表L5,而剩余的列表位于存储1中。如可见的,所得的结构与图10中所示操作之前存在的结构相同。
深移动列表-横跨存储
结合图12描述了此处讨论的移动列表的第三种形式。在该实例中,用户请求列表L2和列表L2下的所有对应的结构和项从存储1的列表L1中移动至存储2的列表L5中。在步骤1中,列表L2被串行化为表示列表L2的副本的二进制大对象B1,且在步骤2中,二进制大对象B1被反串行化为列表L2(2),它是存储2中的列表2的副本。同样,在列表L5和列表L2(2)之间建立持有链接。因为列表L2下的所有结构和项被移动至存储2,因此对于剩余的结构和项进行类似的操作。这样,在步骤3中,列表L3被串行化为表示列表L3的副本的二进制大独享B2,且在步骤4中,二进制大对象B2被反串行化为列表L3(2)。在列表L2(2)和列表L2(2)之间建立持有链接,以反映存储1中现有的结构。在步骤5中,项I2被串行化为表示项I2的副本的二进制大对象B3,且在步骤6中,二进制大对象B3被反串行化为项I2(2)。在列表L2(2)和项I2(2)之间建立持有链接,以反映存储1中现有的结构。在步骤7中,项I被串行化为表示I1的副本的二进制大对象B4,并且在步骤8中,二进制大对象B4被反串行化为项I1(2)。在列表L3(2)和项I1(2)之间建立持有链接,以反映存储1中的现有的结构。在步骤9和10中,从存储1中擦去项I1和I2。因为列表L2和L3是由多个列表所持有的,它们不能简单地从存储1中完全移除。换言之,例如,完全移除列表L2的任何痕迹会导致L2不再由列表L6所列出,这可能不是用户的意图。从而,在步骤11和12中,列表L2和L3用存储1中使用指向存储2中它们各自目标列表L2(2)和L3(2)的代理所替换。同样,移除列表L2和L3之间的持有链接,如同移除列表L1和L2之间的持有链接。这些操作的结果是,列表2以及由列表2直接或间接持有的所有结构和项(即,列表L3和项I1和I2)从存储1移动至存储2。
深移回列表-横跨存储
参考图13,用户现在想要执行与图12中所执行的功能相反的功能。换言之,用户现在想要将列表L2(2)深移回至存储1的列表L1下。在步骤1中,列表L2(2)被串行化为表示列表L2(2)的副本的二进制大对象B1。在步骤2中,使用从二进制大对象B1的反串行化所得的列表L2来替换指向列表L2的代理项。类似地,在步骤3中,列表L3(2)被串行化为表示列表L3(2)的副本的二进制大对象B2,且在步骤4中,使用从二进制大对象B2的反串行化所得的列表L3来替换指向列表L3的代理项。也为非列表项重复该过程。在步骤5中,项I2(2)被串行化为表示项I2(2)的副本的二进制大对象B3,且在步骤6中,二进制大对象B3被反串行化为项I2。同样地,建立列表L2和项I2之间的持有关系来匹配列表L2(2)和项I2(2)之间先前的持有关系。在步骤7中,项I1(2)被串行化为表示项I1(2)的副本的二进制大对象B4,且在步骤8中,二进制大对象B4被反串行化为项I1。同样地,建立列表L3和项I1之间的持有关系来匹配列表L3(2)和项I1(2)之间先前的持有关系。然后,在步骤9-12中,项I1(2)、I2(2)、L3(2)和L2(2)被擦去,因为它们移动且不由任何其它项所持有。如果这些项由另一个项所持有,那么它们可以使用代理项来替换而不是被擦去。结果与根据图12执行的原始深移动列表命令之前存在的结构相同。
浅复制列表-横跨存储
参考图14,用户现在想要将列表L2从存储1复制到存储2,且将该新复制的列表在列表L5下组织。然而,用户不想要复制列表L2下的每一项,仅是那些由列表L2所直接持有的项(列表项和非列表项)。这被称为列表的浅复制。为了执行该命令,在步骤1中,列表L2(将要被复制的列表)被串行化为表示列表L2的副本的二进制大对象B1。在步骤2中,二进制大对象B1被反串行化为新的列表L2(2),它是列表L2的完全相同的副本,除了它位于存储2中而非存储1中。同样,按照用户所需,在现有列表L5和列表L2(2)之间创建持有关系。如果用户决定复制列表L2而不将它置于存储2中的另一列表中,那么列表L2(2)将成为存储2中的浮动项。在步骤3中,指向列表L3的代理项被创建并在列表L2(2)下持有。这是为了匹配原始列表L2和原始列表L3之间的持有关系。类似地,在步骤4中,指向项I2的代理项被创建并在列表L2(2)下持有。这是为了匹配原始项I2和原始列表L2之间的持有关系。结果是列表L2被复制,且指向列表L2下的原始项的代理项被置于列表L2的副本(即列表L2(2))下。以这种方式,系统仅制作用户特别选择来复制的项(即,列表L2)的副本,这样,以最可能匹配用户意图的方式行动。
结构复制列表-横跨存储
结合图15描述了复制列表操作的第二种形式。在该实例中,用户请求复制列表L2和列表L2下对应的结构,使得副本由存储2中的列表L5所持有。从而,在步骤1中,列表L2被串行化为表示列表L2的副本的二进制大对象B1。在步骤2中,二进制大对象B1被反串行化为列表L2(2),且在列表L5和列表L2(2)之间建立持有关系。在步骤3中,列表L3被串行化为表示列表L3的副本的二进制大对象B2。在步骤4中,二进制大对象B2被反串行化为列表L3(2),且在列表L2(2)和列表L3(2)之间建立持有关系以匹配列表L2和列表L3之间的持有关系。在步骤5和6中,目标为项I1和I2的代理项被创建,且其每一个被置于持有关系中以分别匹配项I1和I2。
这样,该操作的结果是列表L2、列表L2直接持有的非列表项以及列表L2下持有的结构被复制到存储2中,而对于列表L2下所持有的但不是直接在列表L2下方的项,在存储2中创建目标为存储1中的原始项的代理项。
深复制列表-横跨存储
结合图16描述了复制列表操作的另一个形式。在该实例中,用户请求列表L2以及列表L2下的所有项被深复制,使得副本在存储2中的列表L5下被持有。该操作类似于结构复制,除了复制所有的项,不论它们是列表还是非列表。从而,在步骤1中,列表L2被串行化为表示列表L2的副本的二进制大对象B1。在步骤2中,二进制大对象B1被反串行化为列表L2(2),且在列表L5和列表L2(2)之间建立持有关系。在步骤3中,列表L3被串行化为表示列表L3的副本的二进制大对象B2。在步骤4中,二进制大对象B2被反串行化为列表L3(2),且在列表L2(2)和列表L3(2)之间建立持有关系以匹配列表L2和列表L3之间的持有关系。在步骤5和6中,项I1和I2被复制到存储2上,而不是创建代理项。这样,在步骤5中,项I2被串行化为表示项I2的副本的二进制大对象B3。在步骤6中,二进制大对象B3被反串行化为项I2(2),且在列表L2(2)下持有以匹配列表L2和项I2之间的持有关系。同样地,在步骤7中,项I1被串行化为表示项I1的副本的二进制大对象B4。在步骤8中,二进制大对象B4被反串行化为项I1(2),项I1(2)在列表L3(2)下持有以匹配列表L3和项I1之间的持有关系。这样,该操作的结果是列表L2以及列表L2下的所有项被复制到存储2。
擦去
图17示出可以与关于擦去项和多个用户对项的访问的讨论来结合使用的示例项结构。在允许多个用户访问同一项和不需其它用户同意而允许单个用户擦去或以其它方式移除这些项之间存在平衡。
在图7示出的说明性结构中,根工作空间“\”直接持有表示分别授权给用户1和用户2的工作空间U1和U2。工作空间U1直接持有工作空间“UDR1”和“Shared”。工作空间U2直接持有工作空间“UDR2”。工作空间UDR1和Shared都直接持有列表L1。工作空间UDR2直接持有列表L2。列表L1和L2都直接持有项I1。
假定在该示例中,用户1创建了列表L1和项I1,且通过建立L1和Shared之间的持有链接(即,通过将列表L1置于工作空间Shared中)来与用户2共享这两项。还假定用户2随后将项I1添加至列表L2。由此,用户2对列表L1和项I1拥有全部权限。然而,假定用户1对列表L2没有权限。在这种情况下,存在对用户1可用的各种组织和生存周期操作。例如,用户1可以从列表L1中移除项I1。项I1将仍旧保留在列表L2以及工作空间UDRI和Shared中。或者,用户1可以从所有的列表中移除列表L1。在这种情况下,项I1将仍旧保留在列表L2中。或者,用户1可以从工作空间UDR或者工作空间Shared中移除列表L1。在该情况下,从中移除列表L1的工作空间中,列表L1和项I1将不再可用。然而,这对其它工作空间没有影响。
另一种选择是,用户1可以从所有的工作空间中移除列表L1。在该情况下,列表L1将一起从存储中被擦去。用户1可能放弃对项I1的兴趣,而项I1将仅在列表L2中对用户2可用。又一选择是,用户1可以放弃对项I1的兴趣,可能是因为用户1不再需要项I1且不在乎在其上发生的事。因此,项I2现在仅在列表L2中对用户2可用。再一种选择是,用户1可以擦去项I1。在该情况下,删除了从列表L1到项I1的持有链接。然而,从列表L2到项I1的链接可能悬挂(即,可能存在但是不指向任何项)。悬挂链接可以保留或可以在下一次打开列表L2时或任何时间被自动清除。
回收
关于图18讨论项的回收,将分为五个标记的部分。如图18的部分1所示,根工作空间“\”直接持有工作空间U1和U2,其每一个分别表示授权给用户1和用户2的工作空间。工作空间U1直接持有列表L1,列表L1又直接持有项I1。工作空间U2直接持有列表L2,列表L2也又直接持有项I1。这样,项I1由列表L1和L2共享。
参考图18的部分2,假定用户1想要回收项I1。在该情况下,项I1可以从用户1的观点被回收(如由工作空间U1发出的虚线所示)。然而,从用户2的观点,项I2仍旧保留在列表L2中。参考图18的部分3,如果用户1清空回收站,那么用户1放弃对项I1的所有兴趣。然而,再一次,项I1仍旧保留在用户2的列表L2中,因为用户2没有请求对项I1的任何操作。
下一步,参考图18的部分4,假定在用户1清空回收站之后,用户2之后想要回收项I1。在该情况下,项I1将从用户2的观点在回收站中出现(如由工作空间U2发出的虚线所示)。参考图18的部分5,当用户2清空回收站时,项I1被完全地删除了,因为没有列表持有项I1。如果另一个列表持有项I1,那么项I1仍旧保留在该其它列表下被持有。
结论
因此,描述了一种新颖的电子文件系统和在这样的系统中管理项的方法。尽管如此处根据本发明的各方面所描述的说明性实施例是作为示例显示的,但是可以理解,本发明不限于这些实施例。